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  }