diff --git a/.eslintignore b/.eslintignore index 495f2baf7..2019b0d18 100644 --- a/.eslintignore +++ b/.eslintignore @@ -80,60 +80,6 @@ packages/app-cli/tests/HtmlToMd.js.map packages/app-cli/tests/MdToHtml.d.ts packages/app-cli/tests/MdToHtml.js packages/app-cli/tests/MdToHtml.js.map -packages/app-cli/tests/Synchronizer.basics.d.ts -packages/app-cli/tests/Synchronizer.basics.js -packages/app-cli/tests/Synchronizer.basics.js.map -packages/app-cli/tests/Synchronizer.conflicts.d.ts -packages/app-cli/tests/Synchronizer.conflicts.js -packages/app-cli/tests/Synchronizer.conflicts.js.map -packages/app-cli/tests/Synchronizer.e2ee.d.ts -packages/app-cli/tests/Synchronizer.e2ee.js -packages/app-cli/tests/Synchronizer.e2ee.js.map -packages/app-cli/tests/Synchronizer.resources.d.ts -packages/app-cli/tests/Synchronizer.resources.js -packages/app-cli/tests/Synchronizer.resources.js.map -packages/app-cli/tests/Synchronizer.revisions.d.ts -packages/app-cli/tests/Synchronizer.revisions.js -packages/app-cli/tests/Synchronizer.revisions.js.map -packages/app-cli/tests/Synchronizer.sharing.d.ts -packages/app-cli/tests/Synchronizer.sharing.js -packages/app-cli/tests/Synchronizer.sharing.js.map -packages/app-cli/tests/Synchronizer.tags.d.ts -packages/app-cli/tests/Synchronizer.tags.js -packages/app-cli/tests/Synchronizer.tags.js.map -packages/app-cli/tests/Synchronizer.tools.d.ts -packages/app-cli/tests/Synchronizer.tools.js -packages/app-cli/tests/Synchronizer.tools.js.map -packages/app-cli/tests/dateTimeFormats.d.ts -packages/app-cli/tests/dateTimeFormats.js -packages/app-cli/tests/dateTimeFormats.js.map -packages/app-cli/tests/file-api-driver.d.ts -packages/app-cli/tests/file-api-driver.js -packages/app-cli/tests/file-api-driver.js.map -packages/app-cli/tests/fsDriver.d.ts -packages/app-cli/tests/fsDriver.js -packages/app-cli/tests/fsDriver.js.map -packages/app-cli/tests/htmlUtils.d.ts -packages/app-cli/tests/htmlUtils.js -packages/app-cli/tests/htmlUtils.js.map -packages/app-cli/tests/models_Folder.d.ts -packages/app-cli/tests/models_Folder.js -packages/app-cli/tests/models_Folder.js.map -packages/app-cli/tests/models_Folder.sharing.d.ts -packages/app-cli/tests/models_Folder.sharing.js -packages/app-cli/tests/models_Folder.sharing.js.map -packages/app-cli/tests/models_Note.d.ts -packages/app-cli/tests/models_Note.js -packages/app-cli/tests/models_Note.js.map -packages/app-cli/tests/models_Setting.d.ts -packages/app-cli/tests/models_Setting.js -packages/app-cli/tests/models_Setting.js.map -packages/app-cli/tests/models_Tag.d.ts -packages/app-cli/tests/models_Tag.js -packages/app-cli/tests/models_Tag.js.map -packages/app-cli/tests/registry.d.ts -packages/app-cli/tests/registry.js -packages/app-cli/tests/registry.js.map packages/app-cli/tests/MdToMd.d.ts packages/app-cli/tests/MdToMd.js packages/app-cli/tests/MdToMd.js.map diff --git a/.gitignore b/.gitignore index e1903e57f..c80170011 100644 --- a/.gitignore +++ b/.gitignore @@ -66,60 +66,6 @@ packages/app-cli/tests/HtmlToMd.js.map packages/app-cli/tests/MdToHtml.d.ts packages/app-cli/tests/MdToHtml.js packages/app-cli/tests/MdToHtml.js.map -packages/app-cli/tests/Synchronizer.basics.d.ts -packages/app-cli/tests/Synchronizer.basics.js -packages/app-cli/tests/Synchronizer.basics.js.map -packages/app-cli/tests/Synchronizer.conflicts.d.ts -packages/app-cli/tests/Synchronizer.conflicts.js -packages/app-cli/tests/Synchronizer.conflicts.js.map -packages/app-cli/tests/Synchronizer.e2ee.d.ts -packages/app-cli/tests/Synchronizer.e2ee.js -packages/app-cli/tests/Synchronizer.e2ee.js.map -packages/app-cli/tests/Synchronizer.resources.d.ts -packages/app-cli/tests/Synchronizer.resources.js -packages/app-cli/tests/Synchronizer.resources.js.map -packages/app-cli/tests/Synchronizer.revisions.d.ts -packages/app-cli/tests/Synchronizer.revisions.js -packages/app-cli/tests/Synchronizer.revisions.js.map -packages/app-cli/tests/Synchronizer.sharing.d.ts -packages/app-cli/tests/Synchronizer.sharing.js -packages/app-cli/tests/Synchronizer.sharing.js.map -packages/app-cli/tests/Synchronizer.tags.d.ts -packages/app-cli/tests/Synchronizer.tags.js -packages/app-cli/tests/Synchronizer.tags.js.map -packages/app-cli/tests/Synchronizer.tools.d.ts -packages/app-cli/tests/Synchronizer.tools.js -packages/app-cli/tests/Synchronizer.tools.js.map -packages/app-cli/tests/dateTimeFormats.d.ts -packages/app-cli/tests/dateTimeFormats.js -packages/app-cli/tests/dateTimeFormats.js.map -packages/app-cli/tests/file-api-driver.d.ts -packages/app-cli/tests/file-api-driver.js -packages/app-cli/tests/file-api-driver.js.map -packages/app-cli/tests/fsDriver.d.ts -packages/app-cli/tests/fsDriver.js -packages/app-cli/tests/fsDriver.js.map -packages/app-cli/tests/htmlUtils.d.ts -packages/app-cli/tests/htmlUtils.js -packages/app-cli/tests/htmlUtils.js.map -packages/app-cli/tests/models_Folder.d.ts -packages/app-cli/tests/models_Folder.js -packages/app-cli/tests/models_Folder.js.map -packages/app-cli/tests/models_Folder.sharing.d.ts -packages/app-cli/tests/models_Folder.sharing.js -packages/app-cli/tests/models_Folder.sharing.js.map -packages/app-cli/tests/models_Note.d.ts -packages/app-cli/tests/models_Note.js -packages/app-cli/tests/models_Note.js.map -packages/app-cli/tests/models_Setting.d.ts -packages/app-cli/tests/models_Setting.js -packages/app-cli/tests/models_Setting.js.map -packages/app-cli/tests/models_Tag.d.ts -packages/app-cli/tests/models_Tag.js -packages/app-cli/tests/models_Tag.js.map -packages/app-cli/tests/registry.d.ts -packages/app-cli/tests/registry.js -packages/app-cli/tests/registry.js.map packages/app-cli/tests/MdToMd.d.ts packages/app-cli/tests/MdToMd.js packages/app-cli/tests/MdToMd.js.map diff --git a/packages/app-cli/tests/models_Tag.ts b/packages/app-cli/tests/models_Tag.ts deleted file mode 100644 index dec24c359..000000000 --- a/packages/app-cli/tests/models_Tag.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { setupDatabaseAndSynchronizer, switchClient, checkThrowAsync } from './test-utils.js'; -import Folder from '@joplin/lib/models/Folder'; -import Note from '@joplin/lib/models/Note'; -import Tag from '@joplin/lib/models/Tag'; - -describe('models_Tag', function() { - - beforeEach(async (done) => { - await setupDatabaseAndSynchronizer(1); - await switchClient(1); - done(); - }); - - it('should add tags by title', (async () => { - const folder1 = await Folder.save({ title: 'folder1' }); - const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id }); - - await Tag.setNoteTagsByTitles(note1.id, ['un', 'deux']); - - const noteTags = await Tag.tagsByNoteId(note1.id); - expect(noteTags.length).toBe(2); - })); - - it('should not allow renaming tag to existing tag names', (async () => { - const folder1 = await Folder.save({ title: 'folder1' }); - const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id }); - - await Tag.setNoteTagsByTitles(note1.id, ['un', 'deux']); - - const tagUn = await Tag.loadByTitle('un'); - const hasThrown = await checkThrowAsync(async () => await Tag.save({ id: tagUn.id, title: 'deux' }, { userSideValidation: true })); - - expect(hasThrown).toBe(true); - })); - - it('should not return tags without notes', (async () => { - const folder1 = await Folder.save({ title: 'folder1' }); - const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id }); - await Tag.setNoteTagsByTitles(note1.id, ['un']); - - let tags = await Tag.allWithNotes(); - expect(tags.length).toBe(1); - - await Note.delete(note1.id); - - tags = await Tag.allWithNotes(); - expect(tags.length).toBe(0); - })); - - it('should return tags with note counts', (async () => { - const folder1 = await Folder.save({ title: 'folder1' }); - const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id }); - const note2 = await Note.save({ title: 'ma 2nd note', parent_id: folder1.id }); - const todo1 = await Note.save({ title: 'todo 1', parent_id: folder1.id, is_todo: 1, todo_completed: 1590085027710 }); - await Tag.setNoteTagsByTitles(note1.id, ['un']); - await Tag.setNoteTagsByTitles(note2.id, ['un']); - await Tag.setNoteTagsByTitles(todo1.id, ['un']); - - let tags = await Tag.allWithNotes(); - expect(tags.length).toBe(1); - expect(tags[0].note_count).toBe(3); - expect(tags[0].todo_completed_count).toBe(1); - - await Note.delete(todo1.id); - - tags = await Tag.allWithNotes(); - expect(tags.length).toBe(1); - expect(tags[0].note_count).toBe(2); - - await Note.delete(note1.id); - - tags = await Tag.allWithNotes(); - expect(tags.length).toBe(1); - expect(tags[0].note_count).toBe(1); - - await Note.delete(note2.id); - - tags = await Tag.allWithNotes(); - expect(tags.length).toBe(0); - })); - - it('should load individual tags with note count', (async () => { - const folder1 = await Folder.save({ title: 'folder1' }); - const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id }); - const note2 = await Note.save({ title: 'ma 2nd note', parent_id: folder1.id }); - const todo1 = await Note.save({ title: 'todo 2', parent_id: folder1.id, is_todo: 1, todo_completed: 1590085027710 }); - const todo2 = await Note.save({ title: 'todo 2', parent_id: folder1.id, is_todo: 1 }); - const tag = await Tag.save({ title: 'mytag' }); - await Tag.addNote(tag.id, note1.id); - - let tagWithCount = await Tag.loadWithCount(tag.id); - expect(tagWithCount.note_count).toBe(1); - - await Tag.addNote(tag.id, note2.id); - tagWithCount = await Tag.loadWithCount(tag.id); - expect(tagWithCount.note_count).toBe(2); - - await Tag.addNote(tag.id, todo1.id); - await Tag.addNote(tag.id, todo2.id); - tagWithCount = await Tag.loadWithCount(tag.id); - expect(tagWithCount.note_count).toBe(4); - expect(tagWithCount.todo_completed_count).toBe(1); - })); - - it('should get common tags for set of notes', (async () => { - const folder1 = await Folder.save({ title: 'folder1' }); - const taga = await Tag.save({ title: 'mytaga' }); - const tagb = await Tag.save({ title: 'mytagb' }); - const tagc = await Tag.save({ title: 'mytagc' }); - await Tag.save({ title: 'mytagd' }); - - const note0 = await Note.save({ title: 'ma note 0', parent_id: folder1.id }); - const note1 = await Note.save({ title: 'ma note 1', parent_id: folder1.id }); - const note2 = await Note.save({ title: 'ma note 2', parent_id: folder1.id }); - const note3 = await Note.save({ title: 'ma note 3', parent_id: folder1.id }); - - await Tag.addNote(taga.id, note1.id); - - await Tag.addNote(taga.id, note2.id); - await Tag.addNote(tagb.id, note2.id); - - await Tag.addNote(taga.id, note3.id); - await Tag.addNote(tagb.id, note3.id); - await Tag.addNote(tagc.id, note3.id); - - let commonTags = await Tag.commonTagsByNoteIds(null); - expect(commonTags.length).toBe(0); - - commonTags = await Tag.commonTagsByNoteIds(undefined); - expect(commonTags.length).toBe(0); - - commonTags = await Tag.commonTagsByNoteIds([]); - expect(commonTags.length).toBe(0); - - commonTags = await Tag.commonTagsByNoteIds([note0.id, note1.id, note2.id, note3.id]); - let commonTagIds = commonTags.map(t => t.id); - expect(commonTagIds.length).toBe(0); - - commonTags = await Tag.commonTagsByNoteIds([note1.id, note2.id, note3.id]); - commonTagIds = commonTags.map(t => t.id); - expect(commonTagIds.length).toBe(1); - expect(commonTagIds.includes(taga.id)).toBe(true); - - commonTags = await Tag.commonTagsByNoteIds([note2.id, note3.id]); - commonTagIds = commonTags.map(t => t.id); - expect(commonTagIds.length).toBe(2); - expect(commonTagIds.includes(taga.id)).toBe(true); - expect(commonTagIds.includes(tagb.id)).toBe(true); - - commonTags = await Tag.commonTagsByNoteIds([note3.id]); - - commonTagIds = commonTags.map(t => t.id); - expect(commonTags.length).toBe(3); - expect(commonTagIds.includes(taga.id)).toBe(true); - expect(commonTagIds.includes(tagb.id)).toBe(true); - expect(commonTagIds.includes(tagc.id)).toBe(true); - })); - -}); diff --git a/packages/lib/models/Tag.test.js b/packages/lib/models/Tag.test.js index f8790b8de..0e583ed52 100644 --- a/packages/lib/models/Tag.test.js +++ b/packages/lib/models/Tag.test.js @@ -51,11 +51,20 @@ describe('models_Tag', function() { const folder1 = await Folder.save({ title: 'folder1' }); const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id }); const note2 = await Note.save({ title: 'ma 2nd note', parent_id: folder1.id }); + const todo1 = await Note.save({ title: 'todo 1', parent_id: folder1.id, is_todo: 1, todo_completed: 1590085027710 }); await Tag.setNoteTagsByTitles(note1.id, ['un']); await Tag.setNoteTagsByTitles(note2.id, ['un']); + await Tag.setNoteTagsByTitles(todo1.id, ['un']); let tags = await Tag.allWithNotes(); expect(tags.length).toBe(1); + expect(tags[0].note_count).toBe(3); + expect(tags[0].todo_completed_count).toBe(1); + + await Note.delete(todo1.id); + + tags = await Tag.allWithNotes(); + expect(tags.length).toBe(1); expect(tags[0].note_count).toBe(2); await Note.delete(note1.id); @@ -74,6 +83,8 @@ describe('models_Tag', function() { const folder1 = await Folder.save({ title: 'folder1' }); const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id }); const note2 = await Note.save({ title: 'ma 2nd note', parent_id: folder1.id }); + const todo1 = await Note.save({ title: 'todo 2', parent_id: folder1.id, is_todo: 1, todo_completed: 1590085027710 }); + const todo2 = await Note.save({ title: 'todo 2', parent_id: folder1.id, is_todo: 1 }); const tag = await Tag.save({ title: 'mytag' }); await Tag.addNote(tag.id, note1.id); @@ -83,6 +94,12 @@ describe('models_Tag', function() { await Tag.addNote(tag.id, note2.id); tagWithCount = await Tag.loadWithCount(tag.id); expect(tagWithCount.note_count).toBe(2); + + await Tag.addNote(tag.id, todo1.id); + await Tag.addNote(tag.id, todo2.id); + tagWithCount = await Tag.loadWithCount(tag.id); + expect(tagWithCount.note_count).toBe(4); + expect(tagWithCount.todo_completed_count).toBe(1); })); it('should get common tags for set of notes', (async () => { @@ -131,6 +148,7 @@ describe('models_Tag', function() { expect(commonTagIds.includes(tagb.id)).toBe(true); commonTags = await Tag.commonTagsByNoteIds([note3.id]); + commonTagIds = commonTags.map(t => t.id); expect(commonTags.length).toBe(3); expect(commonTagIds.includes(taga.id)).toBe(true);