1package deployment
2
3import (
4 "context"
5 "testing"
6
7 "github.com/bnema/zerowrap"
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/mock"
10 "github.com/stretchr/testify/require"
11
12 outmocks "github.com/bnema/gordon/internal/boundaries/out/mocks"
13 "github.com/bnema/gordon/internal/domain"
14)
15
16// TestServiceEnv_ServiceEnvOverridesAppEnv proves per-service env is merged
17// over app-wide env (service wins) and stays scoped to its own service.
18func TestServiceEnv_ServiceEnvOverridesAppEnv(t *testing.T) {
19 svc := NewService(Deps{}, zerowrap.Default())
20 appEnv := map[string]string{"LOG": "info", "APP_ENV": "production"}
21
22 web := pinnedService{
23 name: "web", appEnv: appEnv,
24 spec: domain.AppService{Name: "web", Env: map[string]string{"LOG": "debug", "PORT": "3000"}},
25 }
26 got, files, err := svc.serviceEnv(context.Background(), "blog", web)
27 require.NoError(t, err)
28 assert.Nil(t, files)
29 assert.Equal(t, []string{"APP_ENV=production", "LOG=debug", "PORT=3000"}, got)
30
31 worker := pinnedService{name: "worker", appEnv: appEnv, spec: domain.AppService{Name: "worker"}}
32 got, _, err = svc.serviceEnv(context.Background(), "blog", worker)
33 require.NoError(t, err)
34 assert.Equal(t, []string{"APP_ENV=production", "LOG=info"}, got)
35 assert.Equal(t, map[string]string{"LOG": "info", "APP_ENV": "production"}, appEnv, "app env is not mutated")
36}
37
38// TestServiceEnv_ServiceEnvSecretCollisionFails proves a service env key that
39// collides with a secret key is refused at deploy time with no precedence.
40func TestServiceEnv_ServiceEnvSecretCollisionFails(t *testing.T) {
41 state := outmocks.NewMockAppState(t)
42 state.EXPECT().LoadOwnership(mock.Anything, "blog").Return(domain.AppOwnership{App: "blog", ID: "app-1"}, nil).Maybe()
43 svc := NewService(Deps{State: state}, zerowrap.Default())
44 p := pinnedService{name: "web", spec: domain.AppService{
45 Name: "web", Env: map[string]string{"DB": "x"}, Secrets: map[string]string{"DB": "db"},
46 }}
47
48 _, _, err := svc.serviceEnv(context.Background(), "blog", p)
49 require.ErrorIs(t, err, domain.ErrInvalidAppSpec)
50}