-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils_test.go
146 lines (122 loc) · 3.65 KB
/
utils_test.go
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package main
import (
"os"
"fmt"
"path/filepath"
"database/sql"
"encoding/json"
"sort"
)
func equalStringArrays(x []string, y []string) bool {
if (x == nil) != (y == nil) {
return false
}
if x == nil {
return true
}
if len(x) != len(y) {
return false
}
for i, v := range x {
if v != y[i] {
return false
}
}
return true
}
func equalPathArrays(x []string, y []string, dir string) bool {
if (x == nil) != (y == nil) {
return false
}
if x == nil {
return true
}
if len(x) != len(y) {
return false
}
for i, v := range x {
if v != filepath.Join(dir, y[i]) {
return false
}
}
return true
}
func mockDirectory(path string) error {
err := os.MkdirAll(path, 0700)
if err != nil {
return fmt.Errorf("failed to create the mock directory; %w", err)
}
err = os.WriteFile(filepath.Join(path, "metadata.json"), []byte(`{ "foo": "Aaron had a little lamb", "bar": { "breed": [ "merino", "border leicester" ], "type": "lamb", "cost": 1.5 } }`), 0600)
if err != nil {
return fmt.Errorf("failed to mock a metadata file; %w", err)
}
sub := filepath.Join(path, "stuff")
err = os.Mkdir(sub, 0700)
if err != nil {
return fmt.Errorf("failed to mock a subdirectory; %w", err)
}
err = os.WriteFile(filepath.Join(sub, "metadata.json"), []byte(`{ "characters": [ { "first": "Akari", "last": "Akaza" }, { "first": "Hoshino", "last": "Kyouko" }], "anime": "Yuri Yuru", "id": 10495 }`), 0600)
if err != nil {
return fmt.Errorf("failed to mock a metadata file; %w", err)
}
err = os.WriteFile(filepath.Join(sub, "other.json"), []byte(`{ "name": "chicken tikka masala", "recipe": [ "chicken", "garlic", "rice", "spices" ], "variants": [ "lamb", "fish", "cheese" ] }`), 0600)
if err != nil {
return fmt.Errorf("failed to mock a metadata file; %w", err)
}
sub2 := filepath.Join(path, "whee")
err = os.Mkdir(sub2, 0700)
if err != nil {
return fmt.Errorf("failed to mock a subdirectory; %w", err)
}
err = os.WriteFile(filepath.Join(sub2, "other.json"), []byte(`{ "favorites": [ "Yuru Camp", "Non non biyori" ], "category": { "iyashikei": true, "nsfw": false } }`), 0600)
if err != nil {
return fmt.Errorf("failed to mock a metadata file; %w", err)
}
return nil
}
func listPaths(dbconn * sql.DB, scratch string) ([]string, error) {
rows, err := dbconn.Query("SELECT path FROM paths")
if err != nil {
return nil, err
}
defer rows.Close()
all_paths := []string{}
for rows.Next() {
var path string
err = rows.Scan(&path)
if err != nil {
return nil, err
}
rel, err := filepath.Rel(scratch, path)
if err != nil {
return nil, err
}
all_paths = append(all_paths, rel)
}
sort.Strings(all_paths)
return all_paths, nil
}
func listDirs(dbconn *sql.DB) (map[string][]string, error) {
rows, err := dbconn.Query("SELECT path, json_extract(names, '$') FROM dirs")
if err != nil {
return nil, err
}
defer rows.Close()
output := map[string][]string{}
for rows.Next() {
var path string
var names_raw []byte
err = rows.Scan(&path, &names_raw)
if err != nil {
return nil, err
}
var names []string
err = json.Unmarshal(names_raw, &names)
if err != nil {
return nil, err
}
sort.Strings(names)
output[path] = names
}
return output, nil
}