1 package services
2
3 import (
4 "context"
5 "testing"
6
7 "github.com/DATA-DOG/go-sqlmock"
8 "github.com/stretchr/testify/assert"
9
10 "edge-infra.dev/pkg/edge/api/graph/model"
11 sqlquery "edge-infra.dev/pkg/edge/api/sql"
12 )
13
14 var (
15 action = &model.Action{
16 ActionID: "ac8536ff-d463-4aff-8fa9-fe81fec1ddc1",
17 Input: "input",
18 Action: "delete",
19 Username: "username",
20 Status: "SUCCESS",
21 Error: nil,
22 Time: "2023-05-18 19:21:29.661274+00",
23 BannerEdgeID: &BannerEdgeID,
24 ClusterEdgeID: &ClusterEdgeID,
25 TenantEdgeID: "te8536ff-d463-4aff-8fa9-fe81fec1ddc1",
26 BatchID: &BatchID,
27 }
28 action2 = model.Action{
29 ActionID: "ac8536ff-d463-4aff-8fa9-fe81fec1ddc2",
30 Input: "input2",
31 Action: "delete2",
32 Username: "username2",
33 Status: "SUCCESS",
34 Error: nil,
35 Time: "2023-05-20 19:21:29.661274+00",
36 BannerEdgeID: &BannerEdgeID,
37 ClusterEdgeID: &ClusterEdgeID,
38 TenantEdgeID: "te8536ff-d463-4aff-8fa9-fe81fec1ddc2",
39 BatchID: &BatchID,
40 }
41 Username = "username"
42 BannerEdgeID = "ba8536ff-d463-4aff-8fa9-fe81fec1ddc1"
43 ClusterEdgeID = "cl8536ff-d463-4aff-8fa9-fe81fec1ddc1"
44 TenantEdgeID = "te8536ff-d463-4aff-8fa9-fe81fec1ddc1"
45 BatchID = "batch6ff-d463-4aff-8fa9-fe81fec1ddc1"
46 )
47
48 func TestGetActions(t *testing.T) {
49 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
50 if err != nil {
51 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
52 }
53 defer db.Close()
54 service := NewActivityService(appConfig, db)
55 type test struct {
56 testName string
57 username *string
58 bannerEdgeID *string
59 clusterEdgeID *string
60 batchID *string
61 actionFilt *string
62 statusFilt *string
63 tenantEdgeID string
64 expect []*model.Action
65 mockActionsSQLQuery func() *sqlmock.ExpectedQuery
66 mockCountActionsSQLQuery func() *sqlmock.ExpectedQuery
67 }
68
69 tests := []test{
70 {testName: "queryByUsername",
71 username: &Username,
72 bannerEdgeID: nil,
73 clusterEdgeID: nil,
74 tenantEdgeID: TenantEdgeID,
75 batchID: nil,
76 actionFilt: &action.Action,
77 statusFilt: (*string)(&action.Status),
78 expect: []*model.Action{action},
79 mockActionsSQLQuery: func() *sqlmock.ExpectedQuery {
80 return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery).
81 WithArgs(Username, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1).
82 WillReturnRows(sqlmock.NewRows([]string{
83 "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}).
84 AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time))
85 },
86 mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery {
87 return mock.ExpectQuery(sqlquery.GetActionsCount).
88 WithArgs(Username, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID).
89 WillReturnRows(sqlmock.NewRows([]string{"count"}).
90 AddRow(1))
91 },
92 },
93
94 {testName: "queryByBannerEdgeID",
95 username: nil,
96 bannerEdgeID: &BannerEdgeID,
97 clusterEdgeID: nil,
98 tenantEdgeID: TenantEdgeID,
99 batchID: nil,
100 actionFilt: &action.Action,
101 statusFilt: (*string)(&action.Status),
102 expect: []*model.Action{action},
103 mockActionsSQLQuery: func() *sqlmock.ExpectedQuery {
104 return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery).
105 WithArgs(nil, action.BannerEdgeID, nil, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1).
106 WillReturnRows(sqlmock.NewRows([]string{
107 "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}).
108 AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time))
109 },
110 mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery {
111 return mock.ExpectQuery(sqlquery.GetActionsCount).
112 WithArgs(nil, action.BannerEdgeID, nil, nil, action.Action, action.Status, action.TenantEdgeID).
113 WillReturnRows(sqlmock.NewRows([]string{"count"}).
114 AddRow(1))
115 },
116 },
117
118 {testName: "queryByClusterEdgeID",
119 username: nil,
120 bannerEdgeID: nil,
121 clusterEdgeID: &ClusterEdgeID,
122 tenantEdgeID: TenantEdgeID,
123 batchID: nil,
124 actionFilt: &action.Action,
125 statusFilt: (*string)(&action.Status),
126 expect: []*model.Action{action},
127 mockActionsSQLQuery: func() *sqlmock.ExpectedQuery {
128 return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery).
129 WithArgs(nil, nil, action.ClusterEdgeID, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1).
130 WillReturnRows(sqlmock.NewRows([]string{
131 "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}).
132 AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time))
133 },
134 mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery {
135 return mock.ExpectQuery(sqlquery.GetActionsCount).
136 WithArgs(nil, nil, action.ClusterEdgeID, nil, action.Action, action.Status, action.TenantEdgeID).
137 WillReturnRows(sqlmock.NewRows([]string{"count"}).
138 AddRow(1))
139 },
140 },
141
142 {testName: "queryByBatchID",
143 username: nil,
144 bannerEdgeID: nil,
145 clusterEdgeID: nil,
146 tenantEdgeID: TenantEdgeID,
147 batchID: &BatchID,
148 actionFilt: &action.Action,
149 statusFilt: (*string)(&action.Status),
150 expect: []*model.Action{action},
151 mockActionsSQLQuery: func() *sqlmock.ExpectedQuery {
152 return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery).
153 WithArgs(nil, nil, nil, action.BatchID, action.Action, action.Status, action.TenantEdgeID, action.Time, 1).
154 WillReturnRows(sqlmock.NewRows([]string{
155 "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}).
156 AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time))
157 },
158 mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery {
159 return mock.ExpectQuery(sqlquery.GetActionsCount).
160 WithArgs(nil, nil, nil, action.BatchID, action.Action, action.Status, action.TenantEdgeID).
161 WillReturnRows(sqlmock.NewRows([]string{"count"}).
162 AddRow(1))
163 },
164 },
165
166 {testName: "queryByDefaultTenantEdgeID",
167 username: nil,
168 bannerEdgeID: nil,
169 clusterEdgeID: nil,
170 tenantEdgeID: TenantEdgeID,
171 batchID: nil,
172 actionFilt: &action.Action,
173 statusFilt: (*string)(&action.Status),
174 expect: []*model.Action{action},
175 mockActionsSQLQuery: func() *sqlmock.ExpectedQuery {
176 return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery).
177 WithArgs(nil, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1).
178 WillReturnRows(sqlmock.NewRows([]string{
179 "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}).
180 AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time))
181 },
182 mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery {
183 return mock.ExpectQuery(sqlquery.GetActionsCount).
184 WithArgs(nil, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID).
185 WillReturnRows(sqlmock.NewRows([]string{"count"}).
186 AddRow(1))
187 },
188 },
189 }
190 for _, tc := range tests {
191 tc.mockCountActionsSQLQuery()
192 tc.mockActionsSQLQuery()
193 t.Run(tc.testName, func(t *testing.T) {
194 actions, count, err := service.GetActions(context.Background(), tc.username, tc.bannerEdgeID, tc.clusterEdgeID, tc.batchID, &action.Action, tc.statusFilt, tc.tenantEdgeID, action.Time, 1, false)
195 assert.Equal(t, actions, tc.expect)
196 assert.Equal(t, actions[0], action)
197 assert.NoError(t, err)
198 assert.Equal(t, count, 1)
199 err = mock.ExpectationsWereMet()
200 assert.NoError(t, err)
201 })
202 }
203 }
204
205 func TestCreateAction(t *testing.T) {
206 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
207 if err != nil {
208 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
209 }
210 defer db.Close()
211 mock.ExpectExec(sqlquery.CreateActionEntry).WithArgs(action2.Input, action2.Action, action2.Username, action2.TenantEdgeID, action2.BannerEdgeID, action2.ClusterEdgeID, action2.BatchID, action2.Status, action2.Error, sqlmock.AnyArg()).
212 WillReturnResult(sqlmock.NewResult(1, 1))
213 service := NewActivityService(appConfig, db)
214 err = service.CreateAction(context.Background(), action2)
215 assert.NoError(t, err)
216 err = mock.ExpectationsWereMet()
217 assert.NoError(t, err)
218 }
219
View as plain text