diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md index 26452aa..11732e9 100644 --- a/tests/fixtures/README.md +++ b/tests/fixtures/README.md @@ -1,3 +1,14 @@ # Synthetic fixtures Fixtures in this directory must contain fake credentials only. Never place a real Bitwarden export here. + +## Sample pair + +`sample-export-a.json` and `sample-export-b.json` are synthetic Bitwarden-style exports for manual testing. They intentionally include: + +- An exact login duplicate despite different item IDs, names, folders, favorite flags, casing, and `www.` URL formatting. +- A likely duplicate with the same username and URL but different password, TOTP, notes, and custom fields; B has the newer revision date. +- Unique login and credit-card records. +- A changed secure note that must remain separate for review. + +All values are fake and use `.invalid` domains where applicable. diff --git a/tests/fixtures/sample-export-a.json b/tests/fixtures/sample-export-a.json new file mode 100644 index 0000000..0505788 --- /dev/null +++ b/tests/fixtures/sample-export-a.json @@ -0,0 +1,77 @@ +{ + "encrypted": false, + "folders": [ + {"id": "folder-work", "name": "Work"}, + {"id": "folder-personal", "name": "Personal"} + ], + "collections": [], + "items": [ + { + "id": "a-exact", + "organizationId": null, + "folderId": "folder-work", + "type": 1, + "reprompt": 0, + "name": "Example Portal — Old Label", + "notes": "Synthetic exact duplicate; safe fake data.", + "favorite": false, + "login": { + "username": "alice@example.invalid", + "password": "Fake-Example-Password-123!", + "uris": [{"match": null, "uri": "https://example.com"}], + "totp": null + }, + "fields": [], + "revisionDate": "2026-01-10T12:00:00.000Z" + }, + { + "id": "a-conflict", + "organizationId": null, + "folderId": "folder-work", + "type": 1, + "reprompt": 0, + "name": "Acme Cloud", + "notes": "Older synthetic credential.", + "favorite": true, + "login": { + "username": "demo-user", + "password": "Old-Fake-Password!", + "uris": [{"match": null, "uri": "https://acme.invalid/login"}], + "totp": "JBSWY3DPEHPK3PXP" + }, + "fields": [{"name": "Environment", "value": "test", "type": 0}], + "revisionDate": "2026-02-01T12:00:00.000Z" + }, + { + "id": "a-unique", + "organizationId": null, + "folderId": "folder-personal", + "type": 1, + "reprompt": 0, + "name": "A Only Service", + "notes": "Only in export A.", + "favorite": false, + "login": { + "username": "a-user", + "password": "A-Only-Fake-Secret!", + "uris": [{"match": null, "uri": "https://a-only.invalid"}], + "totp": null + }, + "fields": [], + "revisionDate": "2026-01-15T12:00:00.000Z" + }, + { + "id": "a-note", + "organizationId": null, + "folderId": "folder-personal", + "type": 2, + "reprompt": 0, + "name": "Travel Note", + "notes": "Passport reminder — synthetic fixture only.", + "favorite": false, + "secureNote": {"type": 0}, + "fields": [], + "revisionDate": "2026-01-20T12:00:00.000Z" + } + ] +} diff --git a/tests/fixtures/sample-export-b.json b/tests/fixtures/sample-export-b.json new file mode 100644 index 0000000..2d0313f --- /dev/null +++ b/tests/fixtures/sample-export-b.json @@ -0,0 +1,79 @@ +{ + "encrypted": false, + "folders": [ + {"id": "folder-work-b", "name": "Work"}, + {"id": "folder-personal-b", "name": "Personal"} + ], + "collections": [], + "items": [ + { + "id": "b-exact", + "organizationId": null, + "folderId": "folder-work-b", + "type": 1, + "reprompt": 0, + "name": "Example Portal — New Label", + "notes": "Synthetic exact duplicate; safe fake data.", + "favorite": true, + "login": { + "username": "ALICE@EXAMPLE.INVALID", + "password": "Fake-Example-Password-123!", + "uris": [{"match": null, "uri": "https://www.example.com/"}], + "totp": null + }, + "fields": [], + "revisionDate": "2026-03-10T12:00:00.000Z" + }, + { + "id": "b-conflict", + "organizationId": null, + "folderId": "folder-work-b", + "type": 1, + "reprompt": 0, + "name": "Acme Cloud", + "notes": "Newer synthetic credential.", + "favorite": true, + "login": { + "username": "DEMO-USER", + "password": "New-Fake-Password!", + "uris": [{"match": null, "uri": "https://www.acme.invalid/login/"}], + "totp": "KRSXG5A=" + }, + "fields": [{"name": "Environment", "value": "production", "type": 0}], + "revisionDate": "2026-03-01T12:00:00.000Z" + }, + { + "id": "b-unique", + "organizationId": null, + "folderId": "folder-personal-b", + "type": 3, + "reprompt": 0, + "name": "Synthetic Reward Card", + "notes": "Fake card data; never use.", + "favorite": false, + "card": { + "cardholderName": "Test Person", + "brand": "Visa", + "number": "4111111111111111", + "expMonth": "12", + "expYear": "2099", + "code": "000" + }, + "fields": [], + "revisionDate": "2026-02-20T12:00:00.000Z" + }, + { + "id": "b-note", + "organizationId": null, + "folderId": "folder-personal-b", + "type": 2, + "reprompt": 0, + "name": "Travel Note", + "notes": "Passport reminder — synthetic fixture updated.", + "favorite": false, + "secureNote": {"type": 0}, + "fields": [{"name": "Source", "value": "B", "type": 0}], + "revisionDate": "2026-03-05T12:00:00.000Z" + } + ] +}