Monorepo for Tangled
tangled.org
1package db
2
3import (
4 "fmt"
5 "testing"
6
7 "tangled.org/core/appview/models"
8 "tangled.org/core/orm"
9)
10
11func insertRecentLink(t *testing.T, d *DB, userDid string, linkType models.RecentLinkType, target, visited string) {
12 t.Helper()
13 if _, err := d.Exec(
14 `insert into recent_links (user_did, link_type, target, visited) values (?, ?, ?, ?)`,
15 userDid, string(linkType), target, visited,
16 ); err != nil {
17 t.Fatalf("insertRecentLink %q: %v", target, err)
18 }
19}
20
21func TestUpsertRecentLink_LimitFive(t *testing.T) {
22 d := newTestDB(t)
23 const userDid = "did:plc:akshay"
24
25 for i := range 6 {
26 target := fmt.Sprintf("%d-repo-did", i)
27 if err := UpsertRecentLink(d, userDid, models.RecentLinkTypeRepo, target); err != nil {
28 t.Fatalf("UpsertRecentLink %d: %v", i, err)
29 }
30 }
31
32 if got := countRows(t, d, "select count(*) from recent_links where user_did = ?", userDid); got != 5 {
33 t.Errorf("recent_links count = %d, want 5", got)
34 }
35}
36
37func TestUpsertRecentLink_DeduplicatesAndUpdatesTimestamp(t *testing.T) {
38 d := newTestDB(t)
39 const userDid = "did:plc:akshay"
40 const target = "at://did:plc:akshay/sh.tangled.repo/myrepo"
41
42 insertRecentLink(t, d, userDid, models.RecentLinkTypeIssue, target, "2024-01-01T00:00:00Z")
43
44 if err := UpsertRecentLink(d, userDid, models.RecentLinkTypeIssue, target); err != nil {
45 t.Fatalf("upsert: %v", err)
46 }
47
48 if got := countRows(t, d, "select count(*) from recent_links where user_did = ? and target = ?", userDid, target); got != 1 {
49 t.Errorf("expected 1 row after duplicate upsert, got %d", got)
50 }
51
52 var visited string
53 if err := d.QueryRow("select visited from recent_links where user_did = ? and target = ?", userDid, target).Scan(&visited); err != nil {
54 t.Fatalf("scan visited: %v", err)
55 }
56 if visited <= "2024-01-01T00:00:00Z" {
57 t.Errorf("visited not updated: got %q, want > %q", visited, "2024-01-01T00:00:00Z")
58 }
59}
60
61func TestGetRecentLinks_LessThanFive(t *testing.T) {
62 d := newTestDB(t)
63 const userDid = "did:plc:akshay"
64
65 for i := range 6 {
66 name := fmt.Sprintf("repo-%d", i)
67 insertRecentLink(t, d, userDid, models.RecentLinkTypeRepo, name, "2024-01-01T00:00:00Z")
68 }
69
70 links, err := GetRecentLinks(d, orm.FilterEq("user_did", userDid))
71 if err != nil {
72 t.Fatalf("GetRecentLinks: %v", err)
73 }
74
75 if len(links) > 5 {
76 t.Errorf("GetRecentLinks returned %d links, want <5", len(links))
77 }
78}
79
80func TestGetRecentLinks_OrderedByMostRecent(t *testing.T) {
81 d := newTestDB(t)
82 const userDid = "did:plc:akshay"
83
84 insertRecentLink(t, d, userDid, models.RecentLinkTypeRepo, "repo-first", "2024-01-01T00:00:00Z")
85 insertRecentLink(t, d, userDid, models.RecentLinkTypeRepo, "repo-second", "2024-01-02T00:00:00Z")
86 insertRecentLink(t, d, userDid, models.RecentLinkTypeRepo, "repo-third", "2024-01-03T00:00:00Z")
87
88 links, err := GetRecentLinks(d, orm.FilterEq("user_did", userDid))
89 if err != nil {
90 t.Fatalf("GetRecentLinks: %v", err)
91 }
92
93 if len(links) != 3 {
94 t.Fatalf("expected 3 links, got %d", len(links))
95 }
96 if links[0].Target != "repo-third" {
97 t.Errorf("links[0].Target = %q, want %q", links[0].Target, "repo-third")
98 }
99 if links[2].Target != "repo-first" {
100 t.Errorf("links[2].Target = %q, want %q", links[2].Target, "repo-first")
101 }
102}