github.com/nvkalinin/business-calendar@v1.0.2-0.20220515154925-e7df8a3d0c34/cmd/backup_test.go (about) 1 package cmd 2 3 import ( 4 "compress/gzip" 5 "fmt" 6 "github.com/stretchr/testify/assert" 7 "github.com/stretchr/testify/require" 8 "io" 9 "os" 10 "path/filepath" 11 "strings" 12 "testing" 13 "time" 14 ) 15 16 func TestBackupCmd(t *testing.T) { 17 // 1. Запустить app, подождать SyncOnStart, сделать бекап. 18 19 dir := t.TempDir() 20 _, a, port := newApp(t, func(cmd *Server) { 21 cmd.SyncOnStart = []string{"2021"} 22 cmd.Store.Engine = "bolt" 23 cmd.Store.Bolt.File = dir + "/cal.bolt" 24 }) 25 26 go a.run() 27 defer a.shutdown() 28 waitForHTTP(port) 29 time.Sleep(200 * time.Millisecond) // должно быть достаточно для generic календаря 30 31 cmd := newBackupCmd(port) 32 33 // Тестируем также генерацию имени файла. Для этого переходим во временную директорию. 34 // После теста возвращаемся туда, где были. 35 if wd, err := os.Getwd(); err == nil { 36 defer os.Chdir(wd) //nolint:errcheck // Ничего не поделать. 37 } 38 require.NoError(t, os.Chdir(dir)) 39 40 err := cmd.Execute([]string{}) 41 require.NoError(t, err) 42 43 files, err := filepath.Glob("cal_*.bolt.gz") 44 require.NoError(t, err) 45 require.Len(t, files, 1) 46 47 // 2. Запустить новый app из бекапа и проверить наличие календаря. 48 49 dbFile := gzipDecompress(t, files[0]) 50 _, a, port = newApp(t, func(cmd *Server) { 51 cmd.Store.Engine = "bolt" 52 cmd.Store.Bolt.File = dbFile 53 }) 54 55 go a.run() 56 defer a.shutdown() 57 waitForHTTP(port) 58 59 status, json := getBody(t, fmt.Sprintf("http://localhost:%d/api/cal/2021/01/01", port)) 60 expJson := `{ 61 "weekDay": "fri", 62 "working": true, 63 "type": "normal" 64 }` 65 assert.Equal(t, 200, status) 66 assert.JSONEq(t, expJson, json) 67 } 68 69 func newBackupCmd(port int) (cmd *Backup) { 70 return &Backup{ 71 ServerUrl: fmt.Sprintf("http://127.0.0.1:%d", port), 72 AdminPasswd: "pass", 73 Timeout: 10 * time.Minute, 74 } 75 } 76 77 func gzipDecompress(t *testing.T, path string) (decompressedPath string) { 78 f, err := os.Open(path) 79 require.NoError(t, err) 80 defer f.Close() 81 82 decomp := strings.TrimSuffix(path, ".gz") 83 if decomp == path { 84 decomp = path + "_decomp" 85 } 86 87 df, err := os.Create(decomp) 88 require.NoError(t, err) 89 defer df.Close() 90 91 r, err := gzip.NewReader(f) 92 require.NoError(t, err) 93 defer r.Close() 94 95 _, err = io.Copy(df, r) 96 require.NoError(t, err) 97 98 return decomp 99 }