1
1
// (c) Copyright 2024, SAP SE and ClearlyDefined contributors. Licensed under the MIT license.
2
2
// SPDX-License-Identifier: MIT
3
3
4
+ const chaiAsPromised = require ( 'chai-as-promised' )
5
+ const chai = require ( 'chai' )
6
+ chai . use ( chaiAsPromised )
4
7
const { expect } = require ( 'chai' )
5
8
const sinon = require ( 'sinon' )
6
9
const { QueueHandler, DefinitionUpgrader } = require ( '../../../providers/upgrade/process' )
10
+ const EntityCoordinates = require ( '../../../lib/entityCoordinates' )
7
11
8
12
describe ( 'Definition Upgrade Queue Processing' , ( ) => {
9
13
let logger
@@ -80,7 +84,9 @@ describe('Definition Upgrade Queue Processing', () => {
80
84
} )
81
85
82
86
describe ( 'DefinitionUpgrader' , ( ) => {
83
- const definition = Object . freeze ( { coordinates : 'pypi/pypi/-/test/revision' } )
87
+ const coordinates = 'pypi/pypi/-/test/revision'
88
+ const definition = Object . freeze ( { coordinates : EntityCoordinates . fromString ( coordinates ) } )
89
+ const message = Object . freeze ( { data : { coordinates : definition . coordinates } } )
84
90
let definitionService , versionChecker , upgrader
85
91
86
92
beforeEach ( ( ) => {
@@ -98,7 +104,7 @@ describe('Definition Upgrade Queue Processing', () => {
98
104
definitionService . getStored . resolves ( definition )
99
105
versionChecker . validate . resolves ( )
100
106
101
- await upgrader . processMessage ( { data : { coordinates : 'pypi/pypi/-/test/revision' } } )
107
+ await upgrader . processMessage ( message )
102
108
expect ( definitionService . getStored . calledOnce ) . to . be . true
103
109
expect ( versionChecker . validate . calledOnce ) . to . be . true
104
110
expect ( definitionService . computeStoreAndCurate . calledOnce ) . to . be . true
@@ -108,7 +114,7 @@ describe('Definition Upgrade Queue Processing', () => {
108
114
definitionService . getStored . resolves ( definition )
109
115
versionChecker . validate . resolves ( definition )
110
116
111
- await upgrader . processMessage ( { data : { coordinates : 'pypi/pypi/-/test/revision' } } )
117
+ await upgrader . processMessage ( message )
112
118
expect ( definitionService . getStored . calledOnce ) . to . be . true
113
119
expect ( versionChecker . validate . calledOnce ) . to . be . true
114
120
expect ( definitionService . computeStoreAndCurate . notCalled ) . to . be . true
@@ -118,7 +124,7 @@ describe('Definition Upgrade Queue Processing', () => {
118
124
definitionService . getStored . resolves ( )
119
125
versionChecker . validate . resolves ( )
120
126
121
- await upgrader . processMessage ( { data : { coordinates : 'pypi/pypi/-/test/revision' } } )
127
+ await upgrader . processMessage ( message )
122
128
expect ( definitionService . getStored . calledOnce ) . to . be . true
123
129
expect ( versionChecker . validate . calledOnce ) . to . be . true
124
130
expect ( definitionService . computeStoreAndCurate . calledOnce ) . to . be . true
@@ -130,5 +136,78 @@ describe('Definition Upgrade Queue Processing', () => {
130
136
expect ( versionChecker . validate . notCalled ) . to . be . true
131
137
expect ( definitionService . computeStoreAndCurate . notCalled ) . to . be . true
132
138
} )
139
+
140
+ it ( 'handles exception by rethrowing with coordinates and the original error message' , async ( ) => {
141
+ definitionService . getStored . resolves ( definition )
142
+ versionChecker . validate . resolves ( )
143
+ definitionService . computeStoreAndCurate . rejects ( new Error ( 'test' ) )
144
+
145
+ await expect ( upgrader . processMessage ( message ) ) . to . be . rejectedWith ( Error , / p y p i \/ p y p i \/ - \/ t e s t \/ r e v i s i o n : t e s t / )
146
+ } )
147
+ } )
148
+
149
+ describe ( 'Integration Test' , ( ) => {
150
+ const definition = Object . freeze ( {
151
+ coordinates : { type : 'pypi' , provider : 'pypi' , name : 'test' , revision : 'revision' } ,
152
+ _meta : { schemaVersion : '0.0.1' }
153
+ } )
154
+ const message = Object . freeze ( { data : { ...definition } } )
155
+
156
+ let queue , handler , definitionService , versionChecker
157
+ beforeEach ( ( ) => {
158
+ let definitionUpgrader
159
+ ; ( { definitionService, versionChecker, definitionUpgrader } = setupDefinitionUpgrader ( logger ) )
160
+ queue = {
161
+ dequeueMultiple : sinon . stub ( ) . resolves ( [ message ] ) ,
162
+ delete : sinon . stub ( ) . resolves ( )
163
+ }
164
+ handler = new QueueHandler ( queue , logger , definitionUpgrader )
165
+ } )
166
+
167
+ it ( 'handles exception and logs the coordinates and the original error message' , async ( ) => {
168
+ definitionService . getStored . resolves ( definition )
169
+ versionChecker . validate . resolves ( )
170
+ definitionService . computeStoreAndCurate . rejects ( new Error ( 'test' ) )
171
+
172
+ await handler . work ( true )
173
+ expect ( queue . dequeueMultiple . calledOnce ) . to . be . true
174
+ expect ( queue . delete . called ) . to . be . false
175
+ expect ( logger . error . calledOnce ) . to . be . true
176
+ expect ( logger . error . args [ 0 ] [ 0 ] . message ) . to . match ( / p y p i \/ p y p i \/ - \/ t e s t \/ r e v i s i o n : t e s t / )
177
+ } )
178
+
179
+ it ( 'skips compute if a definition is up-to-date' , async ( ) => {
180
+ definitionService . getStored . resolves ( definition )
181
+ versionChecker . validate . resolves ( definition )
182
+
183
+ await handler . work ( true )
184
+ expect ( definitionService . getStored . calledOnce ) . to . be . true
185
+ expect ( versionChecker . validate . calledOnce ) . to . be . true
186
+ expect ( definitionService . computeStoreAndCurate . notCalled ) . to . be . true
187
+ expect ( queue . delete . called ) . to . be . true
188
+ } )
189
+
190
+ it ( 'recomputes a definition, if a definition is not up-to-date' , async ( ) => {
191
+ definitionService . getStored . resolves ( definition )
192
+ versionChecker . validate . resolves ( )
193
+ await handler . work ( true )
194
+ expect ( definitionService . getStored . calledOnce ) . to . be . true
195
+ expect ( versionChecker . validate . calledOnce ) . to . be . true
196
+ expect ( definitionService . computeStoreAndCurate . calledOnce ) . to . be . true
197
+ expect ( queue . delete . called ) . to . be . true
198
+ } )
133
199
} )
134
200
} )
201
+
202
+ function setupDefinitionUpgrader ( logger ) {
203
+ const definitionService = {
204
+ getStored : sinon . stub ( ) ,
205
+ computeStoreAndCurate : sinon . stub ( ) . resolves ( )
206
+ }
207
+ const versionChecker = {
208
+ validate : sinon . stub ( )
209
+ }
210
+ const definitionUpgrader = new DefinitionUpgrader ( definitionService , logger , versionChecker )
211
+ return { definitionService, versionChecker, definitionUpgrader }
212
+ }
213
+
0 commit comments