1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
package importer
import (
"os"
"path/filepath"
"testing"
"adammathes.com/neko/config"
"adammathes.com/neko/models"
)
func setupTestDB(t *testing.T) {
t.Helper()
config.Config.DBFile = ":memory:"
models.InitDB()
t.Cleanup(func() {
if models.DB != nil {
models.DB.Close()
}
})
}
func TestInsertIItem(t *testing.T) {
setupTestDB(t)
ii := &IItem{
Title: "Test Article",
Url: "https://example.com/article",
Description: "A test article description",
ReadState: false,
Starred: true,
Date: &IDate{Date: "2024-01-15 10:00:00"},
Feed: &IFeed{
Url: "https://example.com/feed",
Title: "Example Feed",
},
}
InsertIItem(ii)
// Verify the feed was created
var feedCount int
models.DB.QueryRow("SELECT COUNT(*) FROM feed").Scan(&feedCount)
if feedCount != 1 {
t.Errorf("Expected 1 feed, got %d", feedCount)
}
// Verify the item was created
var itemCount int
models.DB.QueryRow("SELECT COUNT(*) FROM item").Scan(&itemCount)
if itemCount != 1 {
t.Errorf("Expected 1 item, got %d", itemCount)
}
}
func TestInsertIItemNilFeed(t *testing.T) {
setupTestDB(t)
ii := &IItem{
Title: "No Feed Item",
Url: "https://example.com/nofeed",
Feed: nil,
}
// Should not panic
InsertIItem(ii)
var itemCount int
models.DB.QueryRow("SELECT COUNT(*) FROM item").Scan(&itemCount)
if itemCount != 0 {
t.Errorf("Expected 0 items (nil feed should be skipped), got %d", itemCount)
}
}
func TestInsertIItemExistingFeed(t *testing.T) {
setupTestDB(t)
// Insert feed first
models.DB.Exec("INSERT INTO feed(url, title) VALUES(?, ?)", "https://example.com/feed", "Existing Feed")
ii := &IItem{
Title: "New Article",
Url: "https://example.com/new-article",
Description: "New article desc",
Date: &IDate{Date: "2024-01-15"},
Feed: &IFeed{
Url: "https://example.com/feed",
Title: "Existing Feed",
},
}
InsertIItem(ii)
// Should still be just 1 feed
var feedCount int
models.DB.QueryRow("SELECT COUNT(*) FROM feed").Scan(&feedCount)
if feedCount != 1 {
t.Errorf("Expected 1 feed (reuse existing), got %d", feedCount)
}
}
func TestImportJSON(t *testing.T) {
setupTestDB(t)
dir := t.TempDir()
jsonFile := filepath.Join(dir, "import.json")
content := `{"title":"Article 1","url":"https://example.com/1","description":"desc1","read":false,"starred":false,"date":{"$date":"2024-01-01"},"feed":{"url":"https://example.com/feed","title":"Feed 1"}}
{"title":"Article 2","url":"https://example.com/2","description":"desc2","read":true,"starred":true,"date":{"$date":"2024-01-02"},"feed":{"url":"https://example.com/feed","title":"Feed 1"}}`
err := os.WriteFile(jsonFile, []byte(content), 0644)
if err != nil {
t.Fatal(err)
}
ImportJSON(jsonFile)
var itemCount int
models.DB.QueryRow("SELECT COUNT(*) FROM item").Scan(&itemCount)
if itemCount != 2 {
t.Errorf("Expected 2 items after import, got %d", itemCount)
}
var feedCount int
models.DB.QueryRow("SELECT COUNT(*) FROM feed").Scan(&feedCount)
if feedCount != 1 {
t.Errorf("Expected 1 feed after import, got %d", feedCount)
}
}
|