1 package services
2
3
6 import (
7 "context"
8 "testing"
9
10 "github.com/DATA-DOG/go-sqlmock"
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13
14 "edge-infra.dev/pkg/edge/api/graph/model"
15 sqlquery "edge-infra.dev/pkg/edge/api/sql"
16 )
17
18 var (
19 testClassificationBannerEdgeID = "9c478a9c-b536-4ea9-9f1f-144c87094f6b"
20 classificationEdgeIDs = []string{"de4f477e-1f68-40f7-9f1f-f9c9dc08c250", "9c478a9c-b536-4ea9-94c7-144c87094f6b", "c93fd8fd-531f-42d3-8c96-e827fdbbe0ea", "56d36657-4107-4da5-9787-72b1c07d18a5", "a5aea7e7-2bd6-4f86-862e-6c540feaaae4"}
21 classificationDescriptions = []string{"test-description-1", "test-description-2", "test-description-3", "test-description-4", "test-description-5", "test-description-6", "test-description-7", "test-description-8", "test-description-9"}
22 classificationPods = []string{"test-pod1", "test-pod2", "test-pod3", "test-pod4", "test-pod5", "test-pod6", "test-pod7", "test-pod8", "test-pod9"}
23 classificationContainers = []string{"test-container1", "test-container2", "test-container3", "test-container4", "test-container5", "test-container6", "test-container7", "test-container8", "test-container9"}
24 classificationTypes = []string{"test-type1", "test-type2", "test-type3", "test-type4", "test-type5", "test-type6", "test-type7", "test-type8", "test-type9"}
25 classificationClasses = []string{"audit", "security"}
26 classificationPatterns = []string{"test-pattern1", "test-pattern2", "test-pattern3", "test-pattern4", "test-pattern5", "test-pattern6", "test-pattern7", "test-pattern8", "test-pattern9"}
27
28 testClassifications = &model.LogClassification{
29 Description: classificationDescriptions[0],
30 Pod: classificationPods[0],
31 Container: classificationContainers[0],
32 Type: classificationTypes[0],
33 Class: classificationClasses[0],
34 Pattern: classificationPatterns[0],
35 }
36
37 testClassifications2 = &model.LogClassification{
38 Description: classificationDescriptions[1],
39 Pod: classificationPods[1],
40 Container: classificationContainers[1],
41 Type: classificationTypes[1],
42 Class: classificationClasses[1],
43 Pattern: classificationPatterns[1],
44 }
45
46 multiClassifications = []*model.LogClassification{
47 {
48 BannerEdgeID: testClassificationBannerEdgeID,
49 LogClassificationEdgeID: classificationEdgeIDs[2],
50 Description: classificationDescriptions[2],
51 Pod: classificationPods[2],
52 Container: classificationContainers[2],
53 Type: classificationTypes[2],
54 Class: classificationClasses[0],
55 Pattern: classificationPatterns[2],
56 },
57 {
58 BannerEdgeID: testClassificationBannerEdgeID,
59 LogClassificationEdgeID: classificationEdgeIDs[3],
60 Description: classificationDescriptions[3],
61 Pod: classificationPods[3],
62 Container: classificationContainers[3],
63 Type: classificationTypes[3],
64 Class: classificationClasses[0],
65 Pattern: classificationPatterns[3],
66 },
67 {
68 BannerEdgeID: testClassificationBannerEdgeID,
69 LogClassificationEdgeID: classificationEdgeIDs[4],
70 Description: classificationDescriptions[4],
71 Pod: classificationPods[4],
72 Container: classificationContainers[4],
73 Type: classificationTypes[4],
74 Class: classificationClasses[1],
75 Pattern: classificationPatterns[4],
76 },
77 }
78
79 logClassificationRows = sqlmock.NewRows([]string{"banner_edge_id", "classification_edge_id", "classification_description", "pod", "container", "log_type", "log_class", "pattern"})
80 )
81
82 func TestGetClassification(t *testing.T) {
83 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
84 require.NoError(t, err)
85 defer db.Close()
86
87 mock.ExpectQuery(sqlquery.GetLogClassification).
88 WithArgs(testClassificationBannerEdgeID, classificationEdgeIDs[0]).
89 WillReturnRows(logClassificationRows.
90 AddRow(testClassificationBannerEdgeID, classificationEdgeIDs[0], classificationDescriptions[0], classificationPods[0], classificationContainers[0], classificationTypes[0], classificationClasses[0], classificationPatterns[0]))
91
92 service := NewLogClassificationService(db)
93 logClassification, err := service.GetLogClassification(context.Background(), testClassificationBannerEdgeID, classificationEdgeIDs[0])
94
95 assert.NoError(t, err)
96 assert.NotEmpty(t, logClassification)
97
98 assert.Equal(t, testClassificationBannerEdgeID, logClassification.BannerEdgeID)
99 assert.Equal(t, classificationDescriptions[0], logClassification.Description)
100 assert.Equal(t, classificationPods[0], logClassification.Pod)
101 assert.Equal(t, classificationContainers[0], logClassification.Container)
102 assert.Equal(t, classificationTypes[0], logClassification.Type)
103 assert.Equal(t, classificationClasses[0], logClassification.Class)
104 assert.Equal(t, classificationPatterns[0], logClassification.Pattern)
105 }
106
107 func TestDeleteClassification(t *testing.T) {
108 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
109 require.NoError(t, err)
110 defer db.Close()
111
112 mock.ExpectExec(sqlquery.DeleteLogClassification).WithArgs(testClassificationBannerEdgeID, classificationEdgeIDs[0]).
113 WillReturnResult(sqlmock.NewResult(1, 1))
114
115 service := NewLogClassificationService(db)
116
117 if deleted, err := service.DeleteLogClassification(context.Background(), testClassificationBannerEdgeID, classificationEdgeIDs[0]); !deleted && err != nil {
118 t.Errorf("error was not expected while deleting classification: %s", err)
119 }
120 }
121
122 func TestCreateClassification(t *testing.T) {
123 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
124 require.NoError(t, err)
125 defer db.Close()
126
127 mock.ExpectBegin()
128 mock.ExpectExec(sqlquery.CreateLogClassification).
129 WithArgs(testClassificationBannerEdgeID, classificationEdgeIDs[0], testClassifications.Description, testClassifications.Pod, testClassifications.Container, testClassifications.Type, testClassifications.Class, "").
130 WillReturnResult(sqlmock.NewResult(1, 1))
131
132 mock.ExpectCommit()
133
134 service := NewLogClassificationService(db)
135
136 createClassificationInput := model.CreateClassificationInput{
137 Description: classificationDescriptions[0],
138 Pod: classificationPods[0],
139 Container: classificationContainers[0],
140 Type: classificationTypes[0],
141 Class: model.LogClassSelectionAudit,
142 Pattern: "",
143 }
144
145 result, err := service.CreateLogClassification(context.Background(), testClassificationBannerEdgeID, classificationEdgeIDs[0], createClassificationInput)
146
147 assert.NoError(t, err)
148 assert.Equal(t, testClassificationBannerEdgeID, result.BannerEdgeID)
149 assert.Equal(t, classificationEdgeIDs[0], result.LogClassificationEdgeID)
150 assert.Equal(t, classificationDescriptions[0], result.Description)
151 assert.Equal(t, classificationPods[0], result.Pod)
152 assert.Equal(t, classificationContainers[0], result.Container)
153 assert.Equal(t, classificationTypes[0], result.Type)
154 assert.Equal(t, classificationClasses[0], result.Class)
155 assert.Equal(t, "", result.Pattern)
156 }
157
158 func TestUpdateClassification(t *testing.T) {
159 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
160 require.NoError(t, err)
161 defer db.Close()
162
163 mock.ExpectQuery(sqlquery.GetLogClassification).
164 WithArgs(testClassificationBannerEdgeID, classificationEdgeIDs[1]).
165 WillReturnRows(logClassificationRows.
166 AddRow(testClassificationBannerEdgeID, classificationEdgeIDs[1], classificationDescriptions[0], classificationPods[0], classificationContainers[0], classificationTypes[0], classificationClasses[0], classificationPatterns[0]))
167
168 mock.ExpectBegin()
169 mock.ExpectExec(sqlquery.UpdateLogClassification).
170 WithArgs(testClassificationBannerEdgeID, classificationEdgeIDs[1], testClassifications2.Description, testClassifications2.Pod, testClassifications2.Container, testClassifications2.Type, testClassifications2.Class, testClassifications2.Pattern).
171 WillReturnResult(sqlmock.NewResult(1, 1))
172
173 mock.ExpectCommit()
174
175 service := NewLogClassificationService(db)
176
177 testClass := model.LogClassSelectionSecurity
178 updateClassificationInput := &model.UpdateClassificationInput{
179 Description: &classificationDescriptions[1],
180 Pod: &classificationPods[1],
181 Container: &classificationContainers[1],
182 Type: &classificationTypes[1],
183 Class: &testClass,
184 Pattern: &classificationPatterns[1],
185 }
186
187 result, err := service.UpdateLogClassification(context.Background(), testClassificationBannerEdgeID, classificationEdgeIDs[1], updateClassificationInput)
188
189 assert.NoError(t, err)
190 assert.Equal(t, classificationEdgeIDs[1], result.LogClassificationEdgeID)
191 assert.Equal(t, classificationDescriptions[1], result.Description)
192 assert.Equal(t, classificationPods[1], result.Pod)
193 assert.Equal(t, classificationContainers[1], result.Container)
194 assert.Equal(t, classificationTypes[1], result.Type)
195 assert.Equal(t, classificationClasses[1], result.Class)
196 assert.Equal(t, classificationPatterns[1], result.Pattern)
197
198 if err := mock.ExpectationsWereMet(); err != nil {
199 t.Errorf("there were unfulfilled expectations: %s", err)
200 }
201 }
202
203 func TestGetClassificationByBanner(t *testing.T) {
204 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
205 require.NoError(t, err)
206 defer db.Close()
207
208 mock.ExpectQuery(sqlquery.GetLogClassificationsByBanner).
209 WithArgs(testClassificationBannerEdgeID).
210 WillReturnRows(logClassificationRows.
211 AddRow(testClassificationBannerEdgeID, classificationEdgeIDs[2], classificationDescriptions[2], classificationPods[2], classificationContainers[2], classificationTypes[2], classificationClasses[0], classificationPatterns[2]).
212 AddRow(testClassificationBannerEdgeID, classificationEdgeIDs[3], classificationDescriptions[3], classificationPods[3], classificationContainers[3], classificationTypes[3], classificationClasses[0], classificationPatterns[3]).
213 AddRow(testClassificationBannerEdgeID, classificationEdgeIDs[4], classificationDescriptions[4], classificationPods[4], classificationContainers[4], classificationTypes[4], classificationClasses[1], classificationPatterns[4]))
214
215 service := NewLogClassificationService(db)
216 logClassifications, err := service.GetLogClassificationsByBanner(context.Background(), testClassificationBannerEdgeID)
217
218 assert.NoError(t, err)
219 assert.NotEmpty(t, logClassifications)
220
221 for index, classification := range logClassifications {
222 assert.Equal(t, testClassificationBannerEdgeID, classification.BannerEdgeID)
223 assert.Equal(t, multiClassifications[index].LogClassificationEdgeID, classification.LogClassificationEdgeID)
224 assert.Equal(t, multiClassifications[index].Description, classification.Description)
225 assert.Equal(t, multiClassifications[index].Pod, classification.Pod)
226 assert.Equal(t, multiClassifications[index].Container, classification.Container)
227 assert.Equal(t, multiClassifications[index].Type, classification.Type)
228 assert.Equal(t, multiClassifications[index].Class, classification.Class)
229 assert.Equal(t, multiClassifications[index].Pattern, classification.Pattern)
230 }
231 }
232
View as plain text