package sqlite import ( "fmt" "testing" "github.com/zk-org/zk/internal/core" "github.com/zk-org/zk/internal/util" "github.com/zk-org/zk/internal/util/test/assert" ) // FIXME: Missing tests func TestNoteIndexAddWithLinks(t *testing.T) { db, index := testNoteIndex(t) id, err := index.Add(core.Note{ Path: "log/added.md", Links: []core.Link{ { Title: "Same dir", Href: "log/2021-01-04", Rels: core.LinkRels("rel-1", "rel-2"), }, { Title: "Relative", Href: "f39c8", Snippet: "[Relative](f39c8) link", SnippetStart: 50, SnippetEnd: 100, }, { Title: "Second is added", Href: "f39c8#anchor", Rels: core.LinkRels("second"), }, { Title: "Unknown", Href: "unknown", }, { Title: "URL", Href: "http://example.com", IsExternal: true, Snippet: "External [URL](http://example.com)", }, }, }) assert.Nil(t, err) rows := queryLinkRows(t, db.db, fmt.Sprintf("source_id = %d", id)) assert.Equal(t, rows, []linkRow{ { SourceId: id, TargetId: idPointer(2), Title: "Same dir", Href: "log/2021-01-04", Rels: "\x01rel-1\x01rel-2\x01", }, { SourceId: id, TargetId: idPointer(4), Title: "Relative", Href: "f39c8", Rels: "", Snippet: "[Relative](f39c8) link", SnippetStart: 50, SnippetEnd: 100, }, { SourceId: id, TargetId: idPointer(4), Title: "Second is added", Href: "f39c8#anchor", Rels: "\x01second\x01", }, { SourceId: id, TargetId: nil, Title: "Unknown", Href: "unknown", Rels: "", }, { SourceId: id, TargetId: nil, Title: "URL", Href: "http://example.com", IsExternal: true, Rels: "", Snippet: "External [URL](http://example.com)", }, }) } func TestNoteIndexAddFillsLinksMissingTargetId(t *testing.T) { db, index := testNoteIndex(t) id, err := index.Add(core.Note{ Path: "missing_target.md", }) assert.Nil(t, err) rows := queryLinkRows(t, db.db, fmt.Sprintf("target_id = %d", id)) assert.Equal(t, rows, []linkRow{ { SourceId: 3, TargetId: &id, Title: "Missing target", Href: "missing", Snippet: "There's a Missing target", }, }) } func TestNoteIndexUpdateWithLinks(t *testing.T) { db, index := testNoteIndex(t) links := queryLinkRows(t, db.db, "source_id = 1") assert.Equal(t, links, []linkRow{ { SourceId: 1, TargetId: idPointer(2), Title: "An internal link", Href: "log/2021-01-04.md", Snippet: "[[An internal link]]", }, { SourceId: 1, TargetId: nil, Title: "An external link", Href: "https://domain.com", IsExternal: true, Snippet: "[[An external link]]", }, }) err := index.Update(core.Note{ Path: "log/2021-01-03.md", Links: []core.Link{ { Title: "A new link", Href: "index", Type: core.LinkTypeWikiLink, IsExternal: false, Rels: core.LinkRels("rel"), Snippet: "[[A new link]]", }, { Title: "An external link", Href: "https://domain.com", Type: core.LinkTypeMarkdown, IsExternal: true, Snippet: "[[An external link]]", }, }, }) assert.Nil(t, err) links = queryLinkRows(t, db.db, "source_id = 1") assert.Equal(t, links, []linkRow{ { SourceId: 1, TargetId: idPointer(3), Title: "A new link", Href: "index", Type: "wiki-link", Rels: "\x01rel\x01", Snippet: "[[A new link]]", }, { SourceId: 1, TargetId: nil, Title: "An external link", Href: "https://domain.com", Type: "markdown", IsExternal: true, Snippet: "[[An external link]]", }, }) } func TestNoteIndexAddWithTags(t *testing.T) { db, index := testNoteIndex(t) assertSQL := func(after bool) { assertTagExistsOrNot(t, db, true, "fiction") assertTagExistsOrNot(t, db, after, "new-tag") } assertSQL(false) id, err := index.Add(core.Note{ Path: "log/added.md", Tags: []string{"new-tag", "fiction"}, }) assert.Nil(t, err) assertSQL(true) assertTaggedOrNot(t, db, true, id, "new-tag") assertTaggedOrNot(t, db, true, id, "fiction") } func TestNoteIndexUpdateWithTags(t *testing.T) { db, index := testNoteIndex(t) id := core.NoteID(1) assertSQL := func(after bool) { assertTaggedOrNot(t, db, true, id, "fiction") assertTaggedOrNot(t, db, after, id, "new-tag") assertTaggedOrNot(t, db, after, id, "fantasy") } assertSQL(false) err := index.Update(core.Note{ Path: "log/2021-01-03.md", Tags: []string{"new-tag", "fiction", "fantasy"}, }) assert.Nil(t, err) assertSQL(true) } func testNoteIndex(t *testing.T) (*DB, *NoteIndex) { db := testDB(t) return db, NewNoteIndex("", db, &util.NullLogger) } func assertTagExistsOrNot(t *testing.T, db *DB, shouldExist bool, tag string) { assertExistOrNot(t, db, shouldExist, "SELECT id FROM collections WHERE kind = 'tag' AND name = ?", tag) } func assertTaggedOrNot(t *testing.T, db *DB, shouldBeTagged bool, noteId core.NoteID, tag string) { assertExistOrNot(t, db, shouldBeTagged, "SELECT id FROM notes_collections WHERE note_id = ? AND collection_id IS (SELECT id FROM collections WHERE kind = 'tag' AND name = ?)", noteId, tag) }