-
-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
1 parent
907ac7c
commit 2b28641
Showing
5 changed files
with
285 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
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); | ||
})); | ||
|
||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters