@oneuptime/common 12.0.27 → 12.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/Models/AnalyticsModels/RumSessionChunk.ts +52 -0
  2. package/Models/DatabaseModels/CloudResource.ts +17 -1
  3. package/Models/DatabaseModels/DashboardDomain.ts +43 -0
  4. package/Models/DatabaseModels/MonitorTemplate.ts +15 -3
  5. package/Models/DatabaseModels/RumApplication.ts +35 -2
  6. package/Models/DatabaseModels/StatusPageDomain.ts +43 -0
  7. package/Server/API/DashboardDomainAPI.ts +74 -0
  8. package/Server/API/MicrosoftTeamsAPI.ts +81 -180
  9. package/Server/API/StatusPageDomainAPI.ts +74 -0
  10. package/Server/API/TelemetryAPI.ts +104 -15
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.ts +43 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.ts +40 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  14. package/Server/Middleware/ProjectAuthorization.ts +6 -1
  15. package/Server/Services/DashboardDomainService.ts +131 -0
  16. package/Server/Services/LogPipelineProcessorService.ts +88 -0
  17. package/Server/Services/MonitorTemplateService.ts +70 -11
  18. package/Server/Services/StatusPageDomainService.ts +163 -3
  19. package/Server/Services/StatusPagePrivateUserSessionService.ts +197 -56
  20. package/Server/Types/Domain.ts +17 -0
  21. package/Server/Utils/APIKey/AccessPermission.ts +24 -0
  22. package/Server/Utils/Greenlock/Greenlock.ts +156 -58
  23. package/Server/Utils/LogPipelineProcessorValidation.ts +112 -0
  24. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +1094 -45
  25. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +153 -17
  26. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +12 -5
  27. package/Server/Utils/SessionReplay/SessionReplayIdentity.ts +102 -0
  28. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +11 -2
  29. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +23 -11
  30. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +0 -170
  31. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.ts +158 -0
  32. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +23 -11
  33. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +35 -13
  34. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +505 -0
  35. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +106 -0
  36. package/Tests/App/StatusPage/StatusPageLoginCodeUtil.test.ts +84 -0
  37. package/Tests/App/StatusPage/StatusPageRedirectSafety.test.ts +119 -0
  38. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +81 -0
  39. package/Tests/Models/MonitorTemplateMonitorNameColumn.test.ts +258 -0
  40. package/Tests/Server/API/CustomDomainReissueSslAPI.test.ts +469 -0
  41. package/Tests/Server/API/MicrosoftTeamsBotMessagesEndpoint.test.ts +729 -0
  42. package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +26 -0
  43. package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +402 -0
  44. package/Tests/Server/API/SessionReplayAPI.test.ts +232 -0
  45. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -0
  46. package/Tests/Server/Services/AddCertificateReissueRequestedAtToDomainsMigration.test.ts +287 -0
  47. package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +477 -0
  48. package/Tests/Server/Services/LogPipelineProcessorSaveValidation.test.ts +249 -0
  49. package/Tests/Server/Services/MonitorTemplateServiceBulkSync.test.ts +549 -0
  50. package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +16 -3
  51. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +57 -0
  52. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +151 -15
  53. package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +587 -0
  54. package/Tests/Server/Types/Database/Permissions/ApiKeyFileAccess.test.ts +286 -0
  55. package/Tests/Server/Types/Database/Permissions/MonitorTemplateColumnAccess.test.ts +328 -0
  56. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAndIsNull.test.ts +83 -0
  57. package/Tests/Server/Utils/AI/SRE/ConfidenceSignal.test.ts +377 -0
  58. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +16 -1
  59. package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +250 -0
  60. package/Tests/Server/Utils/LogPipelineProcessorValidation.test.ts +198 -0
  61. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +48 -9
  62. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsAuth.test.ts +726 -0
  63. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +74 -11
  64. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +1107 -0
  65. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +20 -3
  66. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +51 -11
  67. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +1246 -0
  68. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +961 -0
  69. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +653 -0
  70. package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +880 -0
  71. package/Tests/Types/API/HTTPResponse.test.ts +175 -0
  72. package/Tests/Types/API/Route.test.ts +36 -4
  73. package/Tests/Types/Database/DatabaseProperty.test.ts +171 -0
  74. package/Tests/Types/DateLocalShortDateTimeString.test.ts +518 -0
  75. package/Tests/Types/DateLocalTimeString.test.ts +259 -0
  76. package/Tests/Types/DateUserPrefers12HourFormat.test.ts +316 -0
  77. package/Tests/UI/Components/LogsHistogram.test.tsx +41 -2
  78. package/Tests/UI/Components/LogsViewerEmptyStateTimeRange.test.tsx +212 -0
  79. package/Tests/UI/Components/TelemetryChartClockFormat.test.tsx +359 -0
  80. package/Tests/UI/Components/TimeRangePickerClockFormat.test.tsx +422 -0
  81. package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +146 -8
  82. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +520 -0
  83. package/Tests/UI/Utils/Navigation.test.ts +82 -0
  84. package/Tests/Utils/Array.test.ts +100 -0
  85. package/Tests/Utils/CertificateReissue.test.ts +225 -0
  86. package/Tests/Utils/Grok/Grok.test.ts +492 -0
  87. package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +181 -13
  88. package/Types/API/Route.ts +20 -5
  89. package/Types/Date.ts +143 -13
  90. package/Types/Rum/SessionReplay.ts +76 -1
  91. package/UI/Components/Date/TimeRangePickerDropdown.tsx +9 -5
  92. package/UI/Components/LogsViewer/LogsViewer.tsx +12 -7
  93. package/UI/Components/LogsViewer/components/HistogramTooltip.tsx +18 -17
  94. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +21 -28
  95. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +2 -4
  96. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +2 -4
  97. package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +17 -16
  98. package/UI/Utils/Navigation.ts +42 -0
  99. package/Utils/Array.ts +37 -0
  100. package/Utils/CertificateReissue.ts +128 -0
  101. package/Utils/Grok/Grok.ts +461 -0
  102. package/Utils/Grok/GrokPatterns.ts +118 -0
  103. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +58 -6
  104. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +48 -0
  105. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  106. package/build/dist/Models/DatabaseModels/CloudResource.js +19 -2
  107. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  108. package/build/dist/Models/DatabaseModels/DashboardDomain.js +44 -0
  109. package/build/dist/Models/DatabaseModels/DashboardDomain.js.map +1 -1
  110. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +17 -4
  111. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  112. package/build/dist/Models/DatabaseModels/RumApplication.js +37 -3
  113. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  114. package/build/dist/Models/DatabaseModels/StatusPageDomain.js +44 -0
  115. package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
  116. package/build/dist/Server/API/DashboardDomainAPI.js +43 -1
  117. package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
  118. package/build/dist/Server/API/MicrosoftTeamsAPI.js +74 -118
  119. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  120. package/build/dist/Server/API/StatusPageDomainAPI.js +43 -1
  121. package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
  122. package/build/dist/Server/API/TelemetryAPI.js +67 -14
  123. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  124. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js +34 -0
  125. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js.map +1 -0
  126. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js +28 -0
  127. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js.map +1 -0
  128. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  129. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  130. package/build/dist/Server/Middleware/ProjectAuthorization.js +6 -1
  131. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  132. package/build/dist/Server/Services/DashboardDomainService.js +104 -0
  133. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  134. package/build/dist/Server/Services/LogPipelineProcessorService.js +65 -0
  135. package/build/dist/Server/Services/LogPipelineProcessorService.js.map +1 -1
  136. package/build/dist/Server/Services/MonitorTemplateService.js +57 -11
  137. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  138. package/build/dist/Server/Services/StatusPageDomainService.js +132 -3
  139. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  140. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +112 -32
  141. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
  142. package/build/dist/Server/Types/Domain.js +16 -0
  143. package/build/dist/Server/Types/Domain.js.map +1 -1
  144. package/build/dist/Server/Utils/APIKey/AccessPermission.js +24 -0
  145. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  146. package/build/dist/Server/Utils/Greenlock/Greenlock.js +110 -35
  147. package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
  148. package/build/dist/Server/Utils/LogPipelineProcessorValidation.js +77 -0
  149. package/build/dist/Server/Utils/LogPipelineProcessorValidation.js.map +1 -0
  150. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +777 -36
  151. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
  152. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +108 -17
  153. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  154. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  155. package/build/dist/Server/Utils/SessionReplay/SessionReplayIdentity.js +59 -0
  156. package/build/dist/Server/Utils/SessionReplay/SessionReplayIdentity.js.map +1 -0
  157. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +9 -2
  158. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  159. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +17 -6
  160. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  161. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +0 -159
  162. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  163. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js +128 -0
  164. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js.map +1 -0
  165. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +17 -6
  166. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  167. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -13
  168. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  169. package/build/dist/Types/API/Route.js +16 -5
  170. package/build/dist/Types/API/Route.js.map +1 -1
  171. package/build/dist/Types/Date.js +115 -13
  172. package/build/dist/Types/Date.js.map +1 -1
  173. package/build/dist/Types/Rum/SessionReplay.js +38 -0
  174. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  175. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +9 -5
  176. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -1
  177. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +12 -7
  178. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  179. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js +15 -14
  180. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js.map +1 -1
  181. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +17 -22
  182. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  183. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +2 -4
  184. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  185. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +2 -4
  186. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  187. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +15 -14
  188. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
  189. package/build/dist/UI/Utils/Navigation.js +30 -0
  190. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  191. package/build/dist/Utils/Array.js +25 -0
  192. package/build/dist/Utils/Array.js.map +1 -1
  193. package/build/dist/Utils/CertificateReissue.js +97 -0
  194. package/build/dist/Utils/CertificateReissue.js.map +1 -0
  195. package/build/dist/Utils/Grok/Grok.js +324 -0
  196. package/build/dist/Utils/Grok/Grok.js.map +1 -0
  197. package/build/dist/Utils/Grok/GrokPatterns.js +112 -0
  198. package/build/dist/Utils/Grok/GrokPatterns.js.map +1 -0
  199. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +63 -3
  200. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  201. package/package.json +1 -1
  202. package/UI/Utils/JsonWebToken.ts +0 -14
  203. package/build/dist/UI/Utils/JsonWebToken.js +0 -10
  204. package/build/dist/UI/Utils/JsonWebToken.js.map +0 -1
@@ -0,0 +1,249 @@
1
+ import LogPipelineProcessorService from "../../../Server/Services/LogPipelineProcessorService";
2
+ import LogPipelineProcessor from "../../../Models/DatabaseModels/LogPipelineProcessor";
3
+ import BadDataException from "../../../Types/Exception/BadDataException";
4
+ import LogPipelineProcessorType from "../../../Types/Log/LogPipelineProcessorType";
5
+ import ObjectID from "../../../Types/ObjectID";
6
+ import { JSONObject } from "../../../Types/JSON";
7
+ import CreateBy from "../../../Server/Types/Database/CreateBy";
8
+ import UpdateBy from "../../../Server/Types/Database/UpdateBy";
9
+ import { afterEach, describe, expect, it, jest } from "@jest/globals";
10
+
11
+ /*
12
+ * Contract under test — the create/update hooks on
13
+ * LogPipelineProcessorService.
14
+ *
15
+ * `processorType` is a free-text column, so the API has always accepted
16
+ * a GrokParser processor with any configuration at all. Before the
17
+ * processor was implemented that meant a silent no-op
18
+ * (OneUptime/oneuptime#2515); now it means an unparsable pattern would
19
+ * be a silent no-op instead, which is the same failure wearing a
20
+ * different hat. The hooks compile the pattern while a human is still
21
+ * looking at the form.
22
+ *
23
+ * Update is the harder half: a request need not name both fields, so
24
+ * switching `processorType` to GrokParser over a stored severity-remap
25
+ * configuration, or replacing the pattern on a row that is already a
26
+ * GrokParser, both have to be caught by validating the MERGED row.
27
+ */
28
+
29
+ const PROCESSOR_ID: ObjectID = new ObjectID(
30
+ "33333333-3333-4333-8333-333333333333",
31
+ );
32
+
33
+ const service: any = LogPipelineProcessorService as any;
34
+
35
+ function createBy(data: {
36
+ processorType?: string | undefined;
37
+ configuration?: JSONObject | string | undefined;
38
+ }): CreateBy<LogPipelineProcessor> {
39
+ const model: any = new LogPipelineProcessor();
40
+ model.name = "Parse nginx access logs";
41
+ model.processorType = data.processorType;
42
+ model.configuration = data.configuration;
43
+
44
+ return {
45
+ data: model,
46
+ props: { isRoot: true },
47
+ } as CreateBy<LogPipelineProcessor>;
48
+ }
49
+
50
+ function updateBy(
51
+ patch: Record<string, unknown>,
52
+ ): UpdateBy<LogPipelineProcessor> {
53
+ return {
54
+ query: { _id: PROCESSOR_ID.toString() },
55
+ data: patch,
56
+ props: { isRoot: true },
57
+ } as unknown as UpdateBy<LogPipelineProcessor>;
58
+ }
59
+
60
+ /*
61
+ * The update hook reads the rows the update matches so it can merge the
62
+ * patch over them. This stands in for that read.
63
+ */
64
+ function mockStoredRow(row: {
65
+ processorType: string;
66
+ configuration: JSONObject | string;
67
+ }): void {
68
+ const model: any = new LogPipelineProcessor();
69
+ model._id = PROCESSOR_ID.toString();
70
+ model.processorType = row.processorType;
71
+ model.configuration = row.configuration;
72
+
73
+ jest
74
+ .spyOn(service, "findBy")
75
+ .mockImplementation(async (): Promise<Array<LogPipelineProcessor>> => {
76
+ return [model];
77
+ });
78
+ }
79
+
80
+ describe("LogPipelineProcessorService — on create", () => {
81
+ afterEach(() => {
82
+ jest.restoreAllMocks();
83
+ });
84
+
85
+ it("accepts a grok processor with a pattern that compiles", async () => {
86
+ await expect(
87
+ service.onBeforeCreate(
88
+ createBy({
89
+ processorType: LogPipelineProcessorType.GrokParser,
90
+ configuration: {
91
+ source: "body",
92
+ pattern: "%{IPV4:client_ip} %{WORD:verb}",
93
+ },
94
+ }),
95
+ ),
96
+ ).resolves.toBeDefined();
97
+ });
98
+
99
+ it("rejects a grok processor whose pattern does not compile", async () => {
100
+ await expect(
101
+ service.onBeforeCreate(
102
+ createBy({
103
+ processorType: LogPipelineProcessorType.GrokParser,
104
+ configuration: { source: "body", pattern: "%{NOSUCHTHING:x}" },
105
+ }),
106
+ ),
107
+ ).rejects.toThrow(BadDataException);
108
+ });
109
+
110
+ it("rejects a grok processor created with no pattern at all", async () => {
111
+ await expect(
112
+ service.onBeforeCreate(
113
+ createBy({
114
+ processorType: LogPipelineProcessorType.GrokParser,
115
+ configuration: { source: "body" },
116
+ }),
117
+ ),
118
+ ).rejects.toThrow(BadDataException);
119
+ });
120
+
121
+ it("accepts the other processor types unchanged", async () => {
122
+ await expect(
123
+ service.onBeforeCreate(
124
+ createBy({
125
+ processorType: LogPipelineProcessorType.SeverityRemapper,
126
+ configuration: {
127
+ sourceKey: "level",
128
+ mappings: [
129
+ {
130
+ matchValue: "warn",
131
+ severityText: "Warning",
132
+ severityNumber: 13,
133
+ },
134
+ ],
135
+ },
136
+ }),
137
+ ),
138
+ ).resolves.toBeDefined();
139
+ });
140
+ });
141
+
142
+ describe("LogPipelineProcessorService — on update", () => {
143
+ afterEach(() => {
144
+ jest.restoreAllMocks();
145
+ });
146
+
147
+ it("accepts a new pattern that compiles", async () => {
148
+ mockStoredRow({
149
+ processorType: LogPipelineProcessorType.GrokParser,
150
+ configuration: { source: "body", pattern: "%{WORD:verb}" },
151
+ });
152
+
153
+ await expect(
154
+ service.onBeforeUpdate(
155
+ updateBy({
156
+ configuration: { source: "body", pattern: "%{IPV4:client_ip}" },
157
+ }),
158
+ ),
159
+ ).resolves.toBeDefined();
160
+ });
161
+
162
+ it("rejects a new pattern that does not compile", async () => {
163
+ mockStoredRow({
164
+ processorType: LogPipelineProcessorType.GrokParser,
165
+ configuration: { source: "body", pattern: "%{WORD:verb}" },
166
+ });
167
+
168
+ await expect(
169
+ service.onBeforeUpdate(
170
+ updateBy({
171
+ configuration: { source: "body", pattern: "%{NOSUCHTHING:x}" },
172
+ }),
173
+ ),
174
+ ).rejects.toThrow(BadDataException);
175
+ });
176
+
177
+ it("catches a type switch to GrokParser over an unrelated stored configuration", async () => {
178
+ mockStoredRow({
179
+ processorType: LogPipelineProcessorType.SeverityRemapper,
180
+ configuration: { sourceKey: "level", mappings: [] },
181
+ });
182
+
183
+ await expect(
184
+ service.onBeforeUpdate(
185
+ updateBy({ processorType: LogPipelineProcessorType.GrokParser }),
186
+ ),
187
+ ).rejects.toThrow(BadDataException);
188
+ });
189
+
190
+ it("catches a broken pattern written onto a row that is already a GrokParser", async () => {
191
+ mockStoredRow({
192
+ processorType: LogPipelineProcessorType.GrokParser,
193
+ configuration: { source: "body", pattern: "%{WORD:verb}" },
194
+ });
195
+
196
+ await expect(
197
+ service.onBeforeUpdate(
198
+ updateBy({ configuration: { source: "body", pattern: "%{WORD:a b}" } }),
199
+ ),
200
+ ).rejects.toThrow(BadDataException);
201
+ });
202
+
203
+ it("does not read the stored row when the update touches neither field", async () => {
204
+ const findBySpy: any = jest
205
+ .spyOn(service, "findBy")
206
+ .mockImplementation(async (): Promise<Array<LogPipelineProcessor>> => {
207
+ return [];
208
+ });
209
+
210
+ await expect(
211
+ service.onBeforeUpdate(updateBy({ name: "renamed" })),
212
+ ).resolves.toBeDefined();
213
+
214
+ expect(findBySpy).not.toHaveBeenCalled();
215
+ });
216
+
217
+ it("skips validation for a raw SQL expression it cannot evaluate", async () => {
218
+ const findBySpy: any = jest
219
+ .spyOn(service, "findBy")
220
+ .mockImplementation(async (): Promise<Array<LogPipelineProcessor>> => {
221
+ return [];
222
+ });
223
+
224
+ await expect(
225
+ service.onBeforeUpdate(
226
+ updateBy({
227
+ configuration: () => {
228
+ return "some_sql_expression";
229
+ },
230
+ }),
231
+ ),
232
+ ).resolves.toBeDefined();
233
+
234
+ expect(findBySpy).not.toHaveBeenCalled();
235
+ });
236
+
237
+ it("leaves a non-grok processor's configuration alone", async () => {
238
+ mockStoredRow({
239
+ processorType: LogPipelineProcessorType.AttributeRemapper,
240
+ configuration: { sourceKey: "src_ip", targetKey: "source_ip" },
241
+ });
242
+
243
+ await expect(
244
+ service.onBeforeUpdate(
245
+ updateBy({ configuration: { sourceKey: "a", targetKey: "b" } }),
246
+ ),
247
+ ).resolves.toBeDefined();
248
+ });
249
+ });