github.com/mg98/scriptup@v0.1.0/pkg/scriptup/storage/file_storage_test.go (about) 1 package storage 2 3 import ( 4 "os" 5 "reflect" 6 "testing" 7 ) 8 9 const testFilePath = ".test/filedb.txt" 10 11 const testMigrationDir = ".test/migrations" 12 13 func TestFileStorage_Open(t *testing.T) { 14 s := NewFileStorage(testFilePath) 15 16 t.Run("create file if it does not exist", func(t *testing.T) { 17 defer os.Remove(testFilePath) 18 if err := s.Open(); err != nil { 19 t.Fatalf("Open failed: %v", err) 20 } 21 if _, err := os.Stat(testFilePath); err != nil { 22 t.Fatalf("file db file not created: %v", err) 23 } 24 }) 25 26 t.Run("use existing file", func(t *testing.T) { 27 if _, err := os.Create(testFilePath); err != nil { 28 panic(err) 29 } 30 defer os.Remove(testFilePath) 31 if err := s.Open(); err != nil { 32 t.Fatalf("Open failed: %v", err) 33 } 34 }) 35 36 } 37 38 func TestFileStorage_Close(t *testing.T) { 39 if _, err := os.Create(testFilePath); err != nil { 40 panic(err) 41 } 42 defer os.Remove(testFilePath) 43 s := NewFileStorage(testFilePath) 44 if err := s.Open(); err != nil { 45 panic(err) 46 } 47 if err := s.Close(); err != nil { 48 t.Fatalf("Close failed: %v", err) 49 } 50 } 51 52 func TestFileStorage_Append(t *testing.T) { 53 if _, err := os.Create(testFilePath); err != nil { 54 panic(err) 55 } 56 defer os.Remove(testFilePath) 57 58 s := NewFileStorage(testFilePath) 59 if err := s.Open(); err != nil { 60 panic(err) 61 } 62 { 63 if err := s.Append("20200101000000_dummy"); err != nil { 64 t.Fatalf("Append failed: %v", err) 65 } 66 b, err := os.ReadFile(testFilePath) 67 if err != nil { 68 panic(err) 69 } 70 if string(b) != "20200101000000_dummy\n" { 71 t.Fatalf("file content not as expected, got: %s", string(b)) 72 } 73 } 74 { 75 if err := s.Append("20200101000001_dummy"); err != nil { 76 t.Fatalf("Append failed: %v", err) 77 } 78 if err := s.Append("20200101000002_dummy"); err != nil { 79 t.Fatalf("Append failed: %v", err) 80 } 81 b, err := os.ReadFile(testFilePath) 82 if err != nil { 83 panic(err) 84 } 85 if string(b) != "20200101000000_dummy\n20200101000001_dummy\n20200101000002_dummy\n" { 86 t.Fatalf("file content not as expected, got: %s", string(b)) 87 } 88 } 89 } 90 91 func TestFileStorage_Pop(t *testing.T) { 92 f, err := os.Create(testFilePath) 93 if err != nil { 94 panic(err) 95 } 96 defer os.Remove(testFilePath) 97 _, err = f.WriteString("20200101000000_dummy\n20200101000001_dummy\n20200101000002_dummy\n") 98 if err != nil { 99 panic(err) 100 } 101 102 s := NewFileStorage(testFilePath) 103 if err := s.Open(); err != nil { 104 panic(err) 105 } 106 { 107 if err := s.Pop(); err != nil { 108 t.Fatalf("Pop failed: %v", err) 109 } 110 b, err := os.ReadFile(testFilePath) 111 if err != nil { 112 panic(err) 113 } 114 if string(b) != "20200101000000_dummy\n20200101000001_dummy\n" { 115 t.Fatalf("file content not as expected, got: %s", string(b)) 116 } 117 } 118 { 119 if err := s.Pop(); err != nil { 120 t.Fatalf("Pop failed: %v", err) 121 } 122 b, err := os.ReadFile(testFilePath) 123 if err != nil { 124 panic(err) 125 } 126 if string(b) != "20200101000000_dummy\n" { 127 t.Fatalf("file content not as expected, got: %s", string(b)) 128 } 129 } 130 { 131 if err := s.Pop(); err != nil { 132 t.Fatalf("Pop failed: %v", err) 133 } 134 b, err := os.ReadFile(testFilePath) 135 if err != nil { 136 panic(err) 137 } 138 if string(b) != "" { 139 t.Fatalf("file content not as expected, got: %s", string(b)) 140 } 141 } 142 { 143 if err := s.Pop(); err.Error() != "no migrations left" { 144 t.Fatalf("expected error \"no migrations left\", got: %v", err) 145 } 146 } 147 148 } 149 150 func TestFileStorage_All(t *testing.T) { 151 f, err := os.Create(testFilePath) 152 if err != nil { 153 panic(err) 154 } 155 defer os.Remove(testFilePath) 156 157 { 158 s := NewFileStorage(testFilePath) 159 if err := s.Open(); err != nil { 160 panic(err) 161 } 162 entries, err := s.All(OrderAsc) 163 if err != nil { 164 t.Fatalf("All failed: %v", err) 165 } 166 167 if len(entries) != 0 { 168 t.Fatalf("All expected to be empty, got: %v", entries) 169 } 170 } 171 172 _, err = f.WriteString("20200101000000_dummy\n20200101000001_dummy\n20200101000002_dummy") 173 if err != nil { 174 panic(err) 175 } 176 177 { 178 s := NewFileStorage(testFilePath) 179 if err := s.Open(); err != nil { 180 panic(err) 181 } 182 entries, err := s.All(OrderAsc) 183 if err != nil { 184 t.Fatalf("All failed: %v", err) 185 } 186 187 if !reflect.DeepEqual(entries, []string{"20200101000000_dummy", "20200101000001_dummy", "20200101000002_dummy"}) { 188 t.Fatalf("All does not return as expected, got: %v", entries) 189 } 190 } 191 } 192 193 func TestFileStorage_Latest(t *testing.T) { 194 t.Run("empty file, i.e., no records", func(t *testing.T) { 195 if _, err := os.Create(testFilePath); err != nil { 196 panic(err) 197 } 198 defer os.Remove(testFilePath) 199 200 s := NewFileStorage(testFilePath) 201 if err := s.Open(); err != nil { 202 panic(err) 203 } 204 l, err := s.Latest() 205 if err != nil { 206 t.Fatalf("Latest failed: %v", err) 207 } 208 if l != nil { 209 t.Fatalf("latest expected to be nil, got \"%s\"", *l) 210 } 211 }) 212 213 t.Run("single record", func(t *testing.T) { 214 f, err := os.Create(testFilePath) 215 if err != nil { 216 panic(err) 217 } 218 defer os.Remove(testFilePath) 219 if _, err := f.WriteString("dummy\n"); err != nil { 220 panic(err) 221 } 222 223 s := NewFileStorage(testFilePath) 224 if err := s.Open(); err != nil { 225 panic(err) 226 } 227 l, err := s.Latest() 228 if err != nil { 229 t.Fatalf("Latest failed: %v", err) 230 } 231 if *l != "dummy" { 232 t.Fatalf("latest expected to be \"dummy\", got \"%s\"", *l) 233 } 234 }) 235 236 t.Run("many records", func(t *testing.T) { 237 f, err := os.Create(testFilePath) 238 if err != nil { 239 panic(err) 240 } 241 defer os.Remove(testFilePath) 242 if _, err := f.WriteString("dummy\ntammy\nsammy\n"); err != nil { 243 panic(err) 244 } 245 246 s := NewFileStorage(testFilePath) 247 if err := s.Open(); err != nil { 248 panic(err) 249 } 250 l, err := s.Latest() 251 if err != nil { 252 t.Fatalf("Latest failed: %v", err) 253 } 254 if *l != "sammy" { 255 t.Fatalf("latest expected to be \"sammy\", got \"%s\"", *l) 256 } 257 }) 258 }