1 package artifacts
2
3 import (
4 "context"
5 "testing"
6
7 "github.com/DATA-DOG/go-sqlmock"
8 "github.com/google/uuid"
9 "github.com/stretchr/testify/assert"
10
11 clustersvc "edge-infra.dev/pkg/edge/api/services/cluster"
12 clusterlabel "edge-infra.dev/pkg/edge/api/services/cluster/label"
13 sqlquery "edge-infra.dev/pkg/edge/api/sql"
14 "edge-infra.dev/pkg/edge/constants/api/fleet"
15 "edge-infra.dev/pkg/lib/runtime/version"
16 )
17
18 func TestGetClusterArtifactVersions(t *testing.T) {
19 ceid := uuid.NewString()
20 fversion := "sha256:d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64a"
21
22 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
23 if err != nil {
24 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
25 }
26 defer db.Close()
27
28 mock.ExpectQuery(sqlquery.GetClusterArtifactVersions).WithArgs(ceid).
29 WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(fleet.Store, fversion))
30
31 svc := NewArtifactsService(db, nil)
32 result, err := svc.GetClusterArtifactVersions(context.Background(), ceid)
33 assert.NoError(t, err)
34 assert.Len(t, result, 1)
35 assert.NoError(t, mock.ExpectationsWereMet())
36 }
37
38 func TestUpdateClusterFleetVersionAndArtifact(t *testing.T) {
39 ceid := uuid.NewString()
40 fversion := "0.14"
41
42 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
43 if err != nil {
44 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
45 }
46 defer db.Close()
47
48 mock.ExpectQuery(clusterlabel.FetchFleetType).WithArgs(ceid).
49 WillReturnRows(mock.NewRows([]string{"label_key"}).AddRow(fleet.Store))
50
51 mock.ExpectBegin()
52 mock.ExpectExec(sqlquery.UpdateClusterFleetVersion).WithArgs(ceid, fversion).WillReturnResult(sqlmock.NewResult(1, 1))
53 mock.ExpectExec(sqlquery.UpdateClusterArtifactVersions).WithArgs(ceid, fversion).WillReturnResult(sqlmock.NewResult(1, 1))
54 mock.ExpectCommit()
55
56 clusterLabelSvc := clustersvc.NewLabelService(db)
57 svc := NewArtifactsService(db, clusterLabelSvc)
58 assert.NoError(t, svc.UpdateClusterFleetVersionAndArtifact(context.Background(), ceid, fversion))
59 assert.NoError(t, mock.ExpectationsWereMet())
60 }
61
62 func TestUpdateClusterFleetVersionAndArtifact_Validation(t *testing.T) {
63 type tc struct {
64 fleet string
65 version string
66 valid bool
67 }
68
69 tcs := []tc{
70
71 {fleet: fleet.Store, version: "0.14", valid: true},
72 {fleet: fleet.Store, version: "sha256:d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64a", valid: true},
73 {
74
75 fleet: fleet.Store, version: "d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64", valid: true,
76 },
77
78 {fleet: fleet.Store, version: "", valid: false},
79 {fleet: fleet.Store, version: "sha255:d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64a", valid: false},
80 {fleet: fleet.Store, version: "", valid: false},
81 {fleet: fleet.Store, version: "-api.quan", valid: false},
82 {fleet: fleet.Store, version: "-api/quan", valid: false},
83 {fleet: fleet.Store, version: ".14", valid: false},
84 {fleet: "", version: "0.14", valid: false},
85 {fleet: "sto re", version: "0.14", valid: false},
86 {fleet: "store ", version: ":0.14", valid: false},
87 {fleet: "store ", version: ".14", valid: false},
88 }
89
90 for _, test := range tcs {
91 err := validateWeakImageRef(test.fleet, test.version)
92 if test.valid {
93 assert.NoError(t, err, test)
94 } else {
95 assert.Error(t, err, test)
96 }
97 }
98 }
99
100 func TestGetAvailableArtifactVersions(t *testing.T) {
101 fversion := "0.X-test"
102 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
103 if err != nil {
104 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
105 }
106 defer db.Close()
107
108 mock.ExpectQuery(sqlquery.GetAvailableArtifactVersions).WithArgs(fleet.Store).
109 WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(fleet.Store, fversion))
110
111 svc := NewArtifactsService(db, nil)
112 result, err := svc.GetAvailableArtifactVersions(context.Background(), fleet.Store)
113 assert.NoError(t, err)
114 assert.Len(t, result, 1)
115 assert.NoError(t, mock.ExpectationsWereMet())
116 }
117
118 func TestGetLatestAvailableArtifactVersion(t *testing.T) {
119 fversion := "X.Y.Z-test"
120 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
121 if err != nil {
122 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
123 }
124 defer db.Close()
125
126 mock.ExpectQuery(sqlquery.GetLatestAvailableArtifactVersion).WithArgs(fleet.Store).
127 WillReturnRows(mock.NewRows([]string{"version_str"}).AddRow(fversion))
128
129 svc := NewArtifactsService(db, nil)
130 result, err := svc.GetLatestAvailableArtifactVersion(context.Background(), fleet.Store)
131 assert.NoError(t, err)
132 assert.Equal(t, fversion, result.Version)
133 assert.NoError(t, mock.ExpectationsWereMet())
134 }
135
136 func TestAddClusterArtifactVersion(t *testing.T) {
137 ctx := context.Background()
138 ceid := uuid.NewString()
139 artifactVersion := "0.18"
140 artifactName := "distributed-storage"
141 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
142 if err != nil {
143 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
144 }
145 defer db.Close()
146 mock.ExpectBegin()
147 tx, _ := db.Begin()
148 mock.ExpectQuery(sqlquery.GetClusterArtifactVersions).WithArgs(ceid).
149 WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(fleet.Store, artifactVersion))
150 mock.ExpectQuery(clusterlabel.FetchFleetType).WithArgs(ceid).
151 WillReturnRows(mock.NewRows([]string{"label_key"}).AddRow(fleet.Store))
152 mock.ExpectExec(sqlquery.CreateClusterArtifactVersion).WithArgs(ceid, artifactName, artifactVersion).WillReturnResult(sqlmock.NewResult(1, 1))
153 mock.ExpectCommit()
154 clusterLabelSvc := clustersvc.NewLabelService(db)
155 svc := NewArtifactsService(db, clusterLabelSvc)
156 assert.NoError(t, svc.AddClusterArtifactVersion(ctx, tx, ceid, artifactName))
157 assert.NoError(t, tx.Commit())
158 assert.NoError(t, mock.ExpectationsWereMet())
159 }
160
161 func TestDeleteClusterArtifactVersion(t *testing.T) {
162 ctx := context.Background()
163 ceid := uuid.NewString()
164 artifactName := "distributed-storage"
165 version := version.New()
166 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
167 if err != nil {
168 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
169 }
170 defer db.Close()
171
172 mock.ExpectBegin()
173 tx, _ := db.Begin()
174 mock.ExpectQuery(sqlquery.GetClusterArtifactVersions).WithArgs(ceid).
175 WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(artifactName, version.SemVer))
176 mock.ExpectExec(sqlquery.DeleteClusterArtifactVersion).WithArgs(ceid, artifactName).WillReturnResult(sqlmock.NewResult(1, 1))
177 mock.ExpectCommit()
178 svc := NewArtifactsService(db, nil)
179 assert.NoError(t, svc.DeleteClusterArtifactVersion(ctx, tx, ceid, artifactName))
180 assert.NoError(t, tx.Commit())
181 assert.NoError(t, mock.ExpectationsWereMet())
182 }
183
View as plain text