diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb3e4ae..04130b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,11 +4,25 @@ on: push: branches: [master] +env: + RESTIC_VERSION: "0.17.1" + jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + + - name: Install restic@${{ env.RESTIC_VERSION }} + run: | + mkdir -p tools/restic + curl --fail --location --silent --show-error --output tools/restic/restic.bz2 \ + "https://github.com/restic/restic/releases/download/v${RESTIC_VERSION}/restic_${RESTIC_VERSION}_linux_amd64.bz2" + bzip2 -d tools/restic/restic.bz2 + chmod +x tools/restic/restic + echo "$GITHUB_WORKSPACE/tools/restic" >> "$GITHUB_PATH" + - run: restic version + - uses: actions/setup-go@v3 with: go-version: '^1.21' diff --git a/cmd/backup_test.go b/cmd/backup_test.go new file mode 100644 index 0000000..1a31f72 --- /dev/null +++ b/cmd/backup_test.go @@ -0,0 +1,75 @@ +package cmd + +import ( + "os" + "path" + "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v3" +) + +func runCmd(t *testing.T, args ...string) error { + t.Helper() + + viper.Reset() + rootCmd.SetArgs(args) + + err := rootCmd.Execute() + return err +} + +func TestBackupCmd(t *testing.T) { + t.Run("simple local backup and restore", func(t *testing.T) { + workDir := t.TempDir() + + // Prepare content to be backed up + locationDir := path.Join(workDir, "my-location") + err := os.Mkdir(locationDir, 0750) + assert.Nil(t, err) + err = os.WriteFile(path.Join(locationDir, "back-me-up.txt"), []byte("hello world"), 0640) + assert.Nil(t, err) + + // Write config file + config, err := yaml.Marshal(map[string]interface{}{ + "version": 2, + "locations": map[string]map[string]interface{}{ + "my-location": { + "type": "local", + "from": []string{locationDir}, + "to": []string{"test"}, + }, + }, + "backends": map[string]map[string]interface{}{ + "test": { + "type": "local", + "path": path.Join(workDir, "test-backend"), + "key": "supersecret", + }, + }, + }) + assert.Nil(t, err) + configPath := path.Join(workDir, ".autorestic.yml") + err = os.WriteFile(configPath, config, 0640) + assert.Nil(t, err) + + // Init repo (not initialized by default) + err = runCmd(t, "exec", "--ci", "-a", "-c", configPath, "init") + assert.Nil(t, err) + + // Do the backup + err = runCmd(t, "backup", "--ci", "-a", "-c", configPath) + assert.Nil(t, err) + + // Restore in a separate dir + restoreDir := path.Join(workDir, "restore") + err = runCmd(t, "restore", "--ci", "-c", configPath, "-l", "my-location", "--to", restoreDir) + assert.Nil(t, err) + + // Check restored file + restoredContent, err := os.ReadFile(path.Join(restoreDir, locationDir, "back-me-up.txt")) + assert.Nil(t, err) + assert.Equal(t, "hello world", string(restoredContent)) + }) +}