1package cli
2
3import (
4 "context"
5 "io"
6 "testing"
7
8 "github.com/stretchr/testify/require"
9)
10
11type recordingPushOps struct {
12 existsRef string
13 tags [][2]string
14 pushes []string
15 exists bool
16}
17
18func (o *recordingPushOps) Exists(_ context.Context, ref string) (bool, error) {
19 o.existsRef = ref
20 return o.exists, nil
21}
22
23func (o *recordingPushOps) Tag(_ context.Context, source, target string) error {
24 o.tags = append(o.tags, [2]string{source, target})
25 return nil
26}
27
28func (o *recordingPushOps) Push(_ context.Context, ref string) error {
29 o.pushes = append(o.pushes, ref)
30 return nil
31}
32
33func (*recordingPushOps) Build(context.Context, []string) error { return nil }
34
35func TestTagAndPushPreservesExactSourceReference(t *testing.T) {
36 ops := &recordingPushOps{exists: true}
37 img := imagePush{
38 SourceRef: "registry.example.com/team/app:v3",
39 Version: "v4", VersionRef: "registry.example.com/team/app:v4",
40 LatestRef: "registry.example.com/team/app:latest",
41 }
42
43 require.NoError(t, tagAndPush(context.Background(), io.Discard, ops, img))
44 require.Equal(t, img.SourceRef, ops.existsRef)
45 require.Equal(t, [][2]string{
46 {img.SourceRef, img.VersionRef},
47 {img.SourceRef, img.LatestRef},
48 }, ops.tags)
49 require.Equal(t, []string{img.VersionRef, img.LatestRef}, ops.pushes)
50}
51
52func TestTagAndPushRejectsMissingSourceReference(t *testing.T) {
53 ops := &recordingPushOps{exists: true}
54 err := tagAndPush(context.Background(), io.Discard, ops, imagePush{
55 Registry: "registry.example.com", ImageName: "team/app", Version: "v4",
56 })
57 require.EqualError(t, err, "push source image reference cannot be empty")
58 require.Empty(t, ops.existsRef)
59 require.Empty(t, ops.tags)
60 require.Empty(t, ops.pushes)
61}