@@ -33,13 +33,13 @@ class ResembleHelper extends Helper {
3333 * Compare Images
3434 *
3535 * @param image
36- * @param diffImage
3736 * @param options
3837 * @returns {Promise<resolve | reject> }
3938 */
40- async _compareImages ( image , diffImage , options ) {
41- const baseImage = this . baseFolder + image ;
42- const actualImage = this . screenshotFolder + image ;
39+ async _compareImages ( image , options ) {
40+ const baseImage = this . _getBaseImagePath ( image , options ) ;
41+ const actualImage = this . _getActualImagePath ( image ) ;
42+ const diffImage = this . _getDiffImagePath ( image ) ;
4343
4444 // check whether the base and the screenshot images are present.
4545 fs . access ( baseImage , fs . constants . F_OK | fs . constants . R_OK , ( err ) => {
@@ -83,11 +83,11 @@ class ResembleHelper extends Helper {
8383 }
8484 resolve ( data ) ;
8585 if ( data . misMatchPercentage >= tolerance ) {
86- if ( ! fs . existsSync ( getDirName ( this . diffFolder + diffImage ) ) ) {
87- fs . mkdirSync ( getDirName ( this . diffFolder + diffImage ) ) ;
86+ if ( ! fs . existsSync ( getDirName ( diffImage ) ) ) {
87+ fs . mkdirSync ( getDirName ( diffImage ) ) ;
8888 }
89- fs . writeFileSync ( this . diffFolder + diffImage + '.png' , data . getBuffer ( ) ) ;
90- const diffImagePath = path . join ( process . cwd ( ) , this . diffFolder + diffImage + '.png' ) ;
89+ fs . writeFileSync ( diffImage , data . getBuffer ( ) ) ;
90+ const diffImagePath = path . join ( process . cwd ( ) , diffImage ) ;
9191 this . debug ( `Diff Image File Saved to: ${ diffImagePath } ` ) ;
9292 }
9393 }
@@ -102,8 +102,7 @@ class ResembleHelper extends Helper {
102102 * @returns {Promise<*> }
103103 */
104104 async _fetchMisMatchPercentage ( image , options ) {
105- const diffImage = "Diff_" + image . split ( "." ) [ 0 ] ;
106- const result = this . _compareImages ( image , diffImage , options ) ;
105+ const result = this . _compareImages ( image , options ) ;
107106 const data = await Promise . resolve ( result ) ;
108107 return data . misMatchPercentage ;
109108 }
@@ -144,40 +143,38 @@ class ResembleHelper extends Helper {
144143 * This method attaches image attachments of the base, screenshot and diff to the allure reporter when the mismatch exceeds tolerance.
145144 * @param baseImage
146145 * @param misMatch
147- * @param tolerance
146+ * @param options
148147 * @returns {Promise<void> }
149148 */
150149
151- async _addAttachment ( baseImage , misMatch , tolerance ) {
150+ async _addAttachment ( baseImage , misMatch , options ) {
152151 const allure = codeceptjs . container . plugins ( 'allure' ) ;
153- const diffImage = "Diff_" + baseImage . split ( "." ) [ 0 ] + ".png" ;
154152
155- if ( allure !== undefined && misMatch >= tolerance ) {
156- allure . addAttachment ( 'Base Image' , fs . readFileSync ( this . baseFolder + baseImage ) , 'image/png' ) ;
157- allure . addAttachment ( 'Screenshot Image' , fs . readFileSync ( this . screenshotFolder + baseImage ) , 'image/png' ) ;
158- allure . addAttachment ( 'Diff Image' , fs . readFileSync ( this . diffFolder + diffImage ) , 'image/png' ) ;
153+ if ( allure !== undefined && misMatch >= options . tolerance ) {
154+ allure . addAttachment ( 'Base Image' , fs . readFileSync ( this . _getBaseImagePath ( baseImage , options ) ) , 'image/png' ) ;
155+ allure . addAttachment ( 'Screenshot Image' , fs . readFileSync ( this . _getActualImagePath ( baseImage ) ) , 'image/png' ) ;
156+ allure . addAttachment ( 'Diff Image' , fs . readFileSync ( this . _getDiffImagePath ( baseImage ) ) , 'image/png' ) ;
159157 }
160158 }
161159
162160 /**
163161 * This method attaches context, and images to Mochawesome reporter when the mismatch exceeds tolerance.
164162 * @param baseImage
165163 * @param misMatch
166- * @param tolerance
164+ * @param options
167165 * @returns {Promise<void> }
168166 */
169167
170- async _addMochaContext ( baseImage , misMatch , tolerance ) {
168+ async _addMochaContext ( baseImage , misMatch , options ) {
171169 const mocha = this . helpers [ 'Mochawesome' ] ;
172- const diffImage = "Diff_" + baseImage . split ( "." ) [ 0 ] + ".png" ;
173170
174- if ( mocha !== undefined && misMatch >= tolerance ) {
171+ if ( mocha !== undefined && misMatch >= options . tolerance ) {
175172 await mocha . addMochawesomeContext ( "Base Image" ) ;
176- await mocha . addMochawesomeContext ( this . baseFolder + baseImage ) ;
173+ await mocha . addMochawesomeContext ( this . _getBaseImagePath ( baseImage , options ) ) ;
177174 await mocha . addMochawesomeContext ( "ScreenShot Image" ) ;
178- await mocha . addMochawesomeContext ( this . screenshotFolder + baseImage ) ;
175+ await mocha . addMochawesomeContext ( this . _getActualImagePath ( baseImage ) ) ;
179176 await mocha . addMochawesomeContext ( "Diff Image" ) ;
180- await mocha . addMochawesomeContext ( this . diffFolder + diffImage ) ;
177+ await mocha . addMochawesomeContext ( this . _getDiffImagePath ( baseImage ) ) ;
181178 }
182179 }
183180
@@ -189,18 +186,18 @@ class ResembleHelper extends Helper {
189186 * @param region
190187 * @param bucketName
191188 * @param baseImage
192- * @param ifBaseImage - tells if the prepareBaseImage is true or false. If false, then it won't upload the baseImage. However, this parameter is not considered if the config file has a prepareBaseImage set to true.
189+ * @param options
193190 * @returns {Promise<void> }
194191 */
195192
196- async _upload ( accessKeyId , secretAccessKey , region , bucketName , baseImage , ifBaseImage ) {
193+ async _upload ( accessKeyId , secretAccessKey , region , bucketName , baseImage , options ) {
197194 console . log ( "Starting Upload... " ) ;
198195 const s3 = new AWS . S3 ( {
199196 accessKeyId : accessKeyId ,
200197 secretAccessKey : secretAccessKey ,
201198 region : region
202199 } ) ;
203- fs . readFile ( this . screenshotFolder + baseImage , ( err , data ) => {
200+ fs . readFile ( this . _getActualImagePath ( baseImage ) , ( err , data ) => {
204201 if ( err ) throw err ;
205202 let base64data = new Buffer ( data , 'binary' ) ;
206203 const params = {
@@ -213,7 +210,7 @@ class ResembleHelper extends Helper {
213210 console . log ( `Screenshot Image uploaded successfully at ${ uData . Location } ` ) ;
214211 } ) ;
215212 } ) ;
216- fs . readFile ( this . diffFolder + "Diff_" + baseImage , ( err , data ) => {
213+ fs . readFile ( this . _getDiffImagePath ( baseImage ) , ( err , data ) => {
217214 if ( err ) console . log ( "Diff image not generated" ) ;
218215 else {
219216 let base64data = new Buffer ( data , 'binary' ) ;
@@ -228,14 +225,18 @@ class ResembleHelper extends Helper {
228225 } ) ;
229226 }
230227 } ) ;
231- if ( ifBaseImage ) {
232- fs . readFile ( this . baseFolder + baseImage , ( err , data ) => {
228+
229+ // If prepareBaseImage is false, then it won't upload the baseImage. However, this parameter is not considered if the config file has a prepareBaseImage set to true.
230+ if ( this . _getPrepareBaseImage ( options ) ) {
231+ const baseImageName = this . _getBaseImageName ( baseImage , options ) ;
232+
233+ fs . readFile ( this . _getBaseImagePath ( baseImage , options ) , ( err , data ) => {
233234 if ( err ) throw err ;
234235 else {
235236 let base64data = new Buffer ( data , 'binary' ) ;
236237 const params = {
237238 Bucket : bucketName ,
238- Key : `base/${ baseImage } ` ,
239+ Key : `base/${ baseImageName } ` ,
239240 Body : base64data
240241 } ;
241242 s3 . upload ( params , ( uErr , uData ) => {
@@ -256,25 +257,27 @@ class ResembleHelper extends Helper {
256257 * @param region
257258 * @param bucketName
258259 * @param baseImage
260+ * @param options
259261 * @returns {Promise<void> }
260262 */
261263
262- _download ( accessKeyId , secretAccessKey , region , bucketName , baseImage ) {
264+ _download ( accessKeyId , secretAccessKey , region , bucketName , baseImage , options ) {
263265 console . log ( "Starting Download..." ) ;
266+ const baseImageName = this . _getBaseImageName ( baseImage , options ) ;
264267 const s3 = new AWS . S3 ( {
265268 accessKeyId : accessKeyId ,
266269 secretAccessKey : secretAccessKey ,
267270 region : region
268271 } ) ;
269272 const params = {
270273 Bucket : bucketName ,
271- Key : `base/${ baseImage } `
274+ Key : `base/${ baseImageName } `
272275 } ;
273276 return new Promise ( ( resolve ) => {
274277 s3 . getObject ( params , ( err , data ) => {
275278 if ( err ) console . error ( err ) ;
276- console . log ( this . baseFolder + baseImage ) ;
277- fs . writeFileSync ( this . baseFolder + baseImage , data . Body ) ;
279+ console . log ( this . _getBaseImagePath ( baseImage , options ) ) ;
280+ fs . writeFileSync ( this . _getBaseImagePath ( baseImage , options ) , data . Body ) ;
278281 resolve ( "File Downloaded Successfully" ) ;
279282 } ) ;
280283 } ) ;
@@ -308,24 +311,22 @@ class ResembleHelper extends Helper {
308311 options . tolerance = 0 ;
309312 }
310313
311- const prepareBaseImage = options . prepareBaseImage !== undefined
312- ? options . prepareBaseImage
313- : ( this . prepareBaseImage === true )
314314 const awsC = this . config . aws ;
315- if ( awsC !== undefined && prepareBaseImage === false ) {
316- await this . _download ( awsC . accessKeyId , awsC . secretAccessKey , awsC . region , awsC . bucketName , baseImage ) ;
317- }
318- if ( options . prepareBaseImage !== undefined && options . prepareBaseImage ) {
319- await this . _prepareBaseImage ( baseImage ) ;
315+
316+ if ( this . _getPrepareBaseImage ( options ) ) {
317+ await this . _prepareBaseImage ( baseImage , options ) ;
318+ } else if ( awsC !== undefined ) {
319+ await this . _download ( awsC . accessKeyId , awsC . secretAccessKey , awsC . region , awsC . bucketName , baseImage , options ) ;
320320 }
321+
321322 if ( selector ) {
322323 options . boundingBox = await this . _getBoundingBox ( selector ) ;
323324 }
324325 const misMatch = await this . _fetchMisMatchPercentage ( baseImage , options ) ;
325- this . _addAttachment ( baseImage , misMatch , options . tolerance ) ;
326- this . _addMochaContext ( baseImage , misMatch , options . tolerance ) ;
326+ this . _addAttachment ( baseImage , misMatch , options ) ;
327+ this . _addMochaContext ( baseImage , misMatch , options ) ;
327328 if ( awsC !== undefined ) {
328- await this . _upload ( awsC . accessKeyId , awsC . secretAccessKey , awsC . region , awsC . bucketName , baseImage , options . prepareBaseImage )
329+ await this . _upload ( awsC . accessKeyId , awsC . secretAccessKey , awsC . region , awsC . bucketName , baseImage , options )
329330 }
330331
331332 this . debug ( "MisMatch Percentage Calculated is " + misMatch + " for baseline " + baseImage ) ;
@@ -339,14 +340,18 @@ class ResembleHelper extends Helper {
339340 * Function to prepare Base Images from Screenshots
340341 *
341342 * @param screenShotImage Name of the screenshot Image (Screenshot Image Path is taken from Configuration)
343+ * @param options
342344 */
343- async _prepareBaseImage ( screenShotImage ) {
344- await this . _createDir ( this . baseFolder + screenShotImage ) ;
345+ async _prepareBaseImage ( screenShotImage , options ) {
346+ const baseImage = this . _getBaseImagePath ( screenShotImage , options ) ;
347+ const actualImage = this . _getActualImagePath ( screenShotImage ) ;
348+
349+ await this . _createDir ( baseImage ) ;
345350
346- fs . access ( this . screenshotFolder + screenShotImage , fs . constants . F_OK | fs . constants . W_OK , ( err ) => {
351+ fs . access ( actualImage , fs . constants . F_OK | fs . constants . W_OK , ( err ) => {
347352 if ( err ) {
348353 throw new Error (
349- `${ this . screenshotFolder + screenShotImage } ${ err . code === 'ENOENT' ? 'does not exist' : 'is read-only' } ` ) ;
354+ `${ actualImage } ${ err . code === 'ENOENT' ? 'does not exist' : 'is read-only' } ` ) ;
350355 }
351356 } ) ;
352357
@@ -357,7 +362,7 @@ class ResembleHelper extends Helper {
357362 }
358363 } ) ;
359364
360- fs . copyFileSync ( this . screenshotFolder + screenShotImage , this . baseFolder + screenShotImage ) ;
365+ fs . copyFileSync ( actualImage , baseImage ) ;
361366 }
362367
363368 /**
@@ -452,6 +457,60 @@ class ResembleHelper extends Helper {
452457
453458 throw new Error ( 'No matching helper found. Supported helpers: Playwright/WebDriver/Appium/Puppeteer/TestCafe' ) ;
454459 }
460+
461+ /**
462+ * Returns the final name of the expected base image, without a path
463+ * @param image Name of the base-image, without path
464+ * @param options Helper options
465+ * @returns {string }
466+ */
467+ _getBaseImageName ( image , options ) {
468+ return ( options . compareWithImage ? options . compareWithImage : image ) ;
469+ }
470+
471+ /**
472+ * Returns the path to the expected base image
473+ * @param image Name of the base-image, without path
474+ * @param options Helper options
475+ * @returns {string }
476+ */
477+ _getBaseImagePath ( image , options ) {
478+ return this . baseFolder + this . _getBaseImageName ( image , options ) ;
479+ }
480+
481+ /**
482+ * Returns the path to the actual screenshot image
483+ * @param image Name of the image, without path
484+ * @returns {string }
485+ */
486+ _getActualImagePath ( image ) {
487+ return this . screenshotFolder + image ;
488+ }
489+
490+ /**
491+ * Returns the path to the image that displays differences between base and actual image.
492+ * @param image Name of the image, without path
493+ * @returns {string }
494+ */
495+ _getDiffImagePath ( image ) {
496+ const diffImage = "Diff_" + image . split ( "." ) [ 0 ] + ".png" ;
497+ return this . diffFolder + diffImage ;
498+ }
499+
500+ /**
501+ * Returns the final `prepareBaseImage` flag after evaluating options and config values
502+ * @param options Helper options
503+ * @returns {boolean }
504+ */
505+ _getPrepareBaseImage ( options ) {
506+ if ( 'undefined' !== typeof options . prepareBaseImage ) {
507+ // Cast to bool with `!!` for backwards compatibility
508+ return ! ! options . prepareBaseImage ;
509+ } else {
510+ // Compare with `true` for backwards compatibility
511+ return true === this . prepareBaseImage ;
512+ }
513+ }
455514}
456515
457516module . exports = ResembleHelper ;
0 commit comments