1package dto
2
3import (
4 "encoding/json"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9)
10
11// TestBackupDTOsUseAppIdentity proves the wire shape identifies a backup
12// by app, service, and database or volume: a domain is never part of it.
13func TestBackupDTOsUseAppIdentity(t *testing.T) {
14 job := BackupJob{ID: "job-1", App: "shop", Service: "api", Database: "orders", Schedule: "daily", Status: "completed"}
15 volume := VolumeBackupJob{ID: "job-2", App: "shop", Service: "api", VolumeName: "data", RuntimeVolumeName: "gordon-shop--api--vol--data", Status: "completed"}
16
17 for name, payload := range map[string]any{"database job": job, "volume job": volume} {
18 t.Run(name, func(t *testing.T) {
19 raw, err := json.Marshal(payload)
20 require.NoError(t, err)
21 var decoded map[string]any
22 require.NoError(t, json.Unmarshal(raw, &decoded))
23 for _, key := range []string{"id", "app", "service"} {
24 assert.Contains(t, decoded, key)
25 }
26 assert.NotContains(t, decoded, "domain", "a domain is never a backup identity")
27 })
28 }
29
30 runRequest, err := json.Marshal(BackupRunRequest{Service: "api", Database: "orders"})
31 require.NoError(t, err)
32 assert.JSONEq(t, `{"service":"api","database":"orders"}`, string(runRequest))
33
34 volumeRequest, err := json.Marshal(VolumeBackupRunRequest{Service: "api", Volume: "data"})
35 require.NoError(t, err)
36 assert.JSONEq(t, `{"service":"api","volume":"data"}`, string(volumeRequest))
37}