main bac21c6

service_env_internal_test.go RawHistoryFolder

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}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close