@Tags(['kdbx4']) import 'package:kdbx/kdbx.dart'; import 'package:kdbx/src/kdbx_xml.dart'; import 'package:logging/logging.dart'; import 'package:test/test.dart'; import 'package:xml/xml.dart'; import 'internal/test_utils.dart'; import 'kdbx_test.dart'; final _logger = Logger('deleted_objects_test'); void main() { final testUtil = TestUtil(); _logger.finest('Running deleted objects tests.'); group('read tombstones', () { test('load/save keeps deleted objects.', () async { final orig = await testUtil.readKdbxFile('test/test_files/tombstonetest.kdbx'); expect(orig.body.deletedObjects, hasLength(1)); final dt = orig.body.deletedObjects.first.deletionTime.get()!; expect([dt.year, dt.month, dt.day], [2020, 8, 30]); final reload = await testUtil.saveAndRead(orig); expect(reload.body.deletedObjects, hasLength(1)); }); }); group('delete to trash', () { test('move to trash, read previous parent', () { final file = testUtil.createEmptyFile(); final g = file.body.rootGroup; final entry = testUtil.createEntry(file, g, 'foo', 'bar'); expect(g.getAllGroupsAndEntries(), hasLength(2)); file.deleteEntry(entry); // root group, entry and trash group. expect(g.getAllGroupsAndEntries(), hasLength(3)); expect(entry.previousParentGroup.get(), g.uuid); }); }); group('delete permanently', () { test('delete entry', () async { final file = testUtil.createEmptyFile(); final g = file.body.rootGroup; final entry = testUtil.createEntry(file, g, 'foo', 'bar'); expect(g.getAllGroupsAndEntries().length, 2); file.deleteEntry(entry); // moved into trash bin expect(g.getAllGroupsAndEntries().length, 3); // now delete from trash file.deletePermanently(entry); expect(g.getAllGroupsAndEntries().length, 2); final xml = file.body.generateXml(FakeProtectedSaltGenerator()); final objects = xml.findAllElements(KdbxXml.NODE_DELETED_OBJECT); expect(objects.length, 1); expect(objects.first.findElements(KdbxXml.NODE_UUID).first.text, entry.uuid.uuid); }); test('delete group', () async { final file = testUtil.createEmptyFile(); final rootGroup = file.body.rootGroup; final g = file.createGroup(parent: rootGroup, name: 'group'); final objs = [ g, testUtil.createEntry(file, g, 'foo', 'bar'), testUtil.createEntry(file, g, 'foo2', 'bar2'), testUtil.createEntry(file, g, 'foo3', 'bar3'), ]; expect(rootGroup.getAllGroupsAndEntries().length, 5); file.deletePermanently(g); expect(rootGroup.getAllGroupsAndEntries().length, 1); final xml = file.body.generateXml(FakeProtectedSaltGenerator()); final objects = xml.findAllElements(KdbxXml.NODE_DELETED_OBJECT); expect(objects.length, 4); expect(objects.map((e) => e.findElements(KdbxXml.NODE_UUID).first.text), objs.map((o) => o.uuid.uuid)); }); }); }