github.com/ngicks/gokugen@v0.0.5/impl/repository/sqlite3_repository_test.go (about) 1 package repository_test 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "testing" 8 "time" 9 10 "github.com/ngicks/gokugen/impl/repository" 11 taskstorage "github.com/ngicks/gokugen/task_storage" 12 ) 13 14 func newDbFilename() string { 15 p, err := os.MkdirTemp("", "sqlite3-tmp-*") 16 if err != nil { 17 panic(err) 18 } 19 return filepath.Join(p, "db") 20 } 21 22 func TestSqlite3Repo(t *testing.T) { 23 dbFilename := newDbFilename() 24 25 fmt.Println(dbFilename) 26 27 db, err := repository.NewSql3Repo(dbFilename) 28 if err != nil { 29 t.Fatal(err) 30 } 31 defer db.Close() 32 33 now := time.UnixMilli(time.Now().UnixMilli()) 34 taskId, err := db.Insert(taskstorage.TaskInfo{ 35 WorkId: "foobarbaz", 36 Param: nil, 37 ScheduledTime: now, 38 }) 39 if err != nil { 40 t.Fatal(err) 41 } 42 43 taskInfo, err := db.GetById(taskId) 44 45 if err != nil { 46 t.Fatal(err) 47 } 48 if taskInfo.Id != taskId { 49 t.Fatalf("%s != %s", taskId, taskInfo.Id) 50 } else if taskInfo.Param != nil { 51 t.Fatalf("%v != %v", nil, taskInfo.Param) 52 } else if taskInfo.ScheduledTime != now { 53 t.Fatalf("%s != %s", now.Format(time.RFC3339Nano), taskInfo.ScheduledTime.Format(time.RFC3339Nano)) 54 } 55 56 _, err = db.Insert(taskstorage.TaskInfo{ 57 WorkId: "qux", 58 Param: map[string]string{"foo": "bar"}, 59 ScheduledTime: now, 60 }) 61 if err != nil { 62 t.Fatal(err) 63 } 64 65 _, err = db.Insert(taskstorage.TaskInfo{ 66 WorkId: "corge", 67 Param: []string{"foo", "bar"}, 68 ScheduledTime: now, 69 }) 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 taskInfos, err := db.GetAll() 75 if err != nil { 76 t.Fatal(err) 77 } 78 var lastUpdated time.Time 79 for _, v := range taskInfos { 80 if lastUpdated.Before(v.LastModified) { 81 lastUpdated = v.LastModified 82 } 83 } 84 85 time.Sleep(2 * time.Millisecond) 86 87 err = db.Update(taskId, taskstorage.UpdateDiff{ 88 UpdateKey: taskstorage.UpdateKey{ 89 WorkId: true, 90 Param: true, 91 ScheduledTime: true, 92 State: true, 93 }, 94 Diff: taskstorage.TaskInfo{ 95 WorkId: "bazbaz", 96 Param: true, 97 ScheduledTime: lastUpdated, 98 State: taskstorage.Done, 99 }, 100 }) 101 if err != nil { 102 t.Fatal(err) 103 } 104 105 taskInfos, err = db.GetUpdatedSince(lastUpdated.Add(time.Millisecond)) 106 if err != nil { 107 t.Fatal(err) 108 } 109 if len(taskInfos) != 1 { 110 t.Fatalf("must be 1 but %d", len(taskInfos)) 111 } 112 taskInfo = taskInfos[0] 113 114 if taskInfo.Id != taskId { 115 t.Fatalf("%s != %s", taskId, taskInfo.Id) 116 } else if taskInfo.Param != true { 117 t.Fatalf("%v != %v", true, taskInfo.Param) 118 } else if taskInfo.ScheduledTime != lastUpdated { 119 t.Fatalf("%s != %s", lastUpdated.Format(time.RFC3339Nano), taskInfo.ScheduledTime.Format(time.RFC3339Nano)) 120 } 121 } 122 123 func TestSqlite3RepoSearchResultOrder(t *testing.T) { 124 var err error 125 126 db, err := repository.NewSql3Repo(newDbFilename()) 127 if err != nil { 128 t.Fatal(err) 129 } 130 defer db.Close() 131 132 _, err = db.Insert(taskstorage.TaskInfo{ 133 WorkId: "0", 134 Param: nil, 135 ScheduledTime: time.Now(), 136 }) 137 if err != nil { 138 t.Fatal(err) 139 } 140 time.Sleep(time.Microsecond) 141 _, err = db.Insert(taskstorage.TaskInfo{ 142 WorkId: "1", 143 Param: nil, 144 ScheduledTime: time.Now(), 145 }) 146 if err != nil { 147 t.Fatal(err) 148 } 149 time.Sleep(time.Microsecond) 150 _, err = db.Insert(taskstorage.TaskInfo{ 151 WorkId: "2", 152 Param: nil, 153 ScheduledTime: time.Now(), 154 }) 155 if err != nil { 156 t.Fatal(err) 157 } 158 159 all, err := db.GetAll() 160 if err != nil { 161 t.Fatal(err) 162 } 163 if !(all[0].WorkId == "0" && all[1].WorkId == "1" && all[2].WorkId == "2") { 164 t.Fatalf("wrong query: %v", all) 165 } 166 167 updatedSince, err := db.GetUpdatedSince(all[1].LastModified) 168 if err != nil { 169 t.Fatal(err) 170 } 171 if !(updatedSince[0].WorkId == "1" && updatedSince[1].WorkId == "2") { 172 t.Fatalf("wrong query: %v", updatedSince) 173 } 174 }