@@ -588,6 +588,162 @@ describe('executeImageCompare', () => {
588588 expect ( result ) . toMatchSnapshot ( )
589589 } )
590590
591+ it ( 'should compare from base64 when not saving actuals' , async ( ) => {
592+ const base64Image = Buffer . from ( 'base64-image' ) . toString ( 'base64' )
593+ const optionsWithBase64 = {
594+ ...mockOptions ,
595+ folderOptions : {
596+ ...mockOptions . folderOptions ,
597+ alwaysSaveActualImage : false ,
598+ autoSaveBaseline : false ,
599+ }
600+ }
601+ vi . mocked ( compareImages . default ) . mockResolvedValue ( {
602+ rawMisMatchPercentage : 0 ,
603+ misMatchPercentage : 0 ,
604+ getBuffer : vi . fn ( ) . mockResolvedValue ( Buffer . from ( 'diff-image-data' ) ) ,
605+ diffBounds : { left : 0 , top : 0 , right : 0 , bottom : 0 } ,
606+ analysisTime : 10 ,
607+ diffPixels : [ ]
608+ } )
609+
610+ await executeImageCompare ( {
611+ isViewPortScreenshot : true ,
612+ isNativeContext : false ,
613+ options : optionsWithBase64 ,
614+ testContext : mockTestContext ,
615+ actualBase64Image : base64Image ,
616+ } )
617+
618+ expect ( images . saveBase64Image ) . not . toHaveBeenCalled ( )
619+ expect ( compareImages . default ) . toHaveBeenCalledWith (
620+ expect . any ( Buffer ) ,
621+ Buffer . from ( base64Image , 'base64' ) ,
622+ expect . any ( Object ) ,
623+ )
624+ expect ( fsPromises . writeFile ) . not . toHaveBeenCalled ( )
625+ } )
626+
627+ it ( 'should disable JSON reports when actuals are not saved' , async ( ) => {
628+ const optionsWithJsonButNoSave = {
629+ ...mockOptions ,
630+ folderOptions : {
631+ ...mockOptions . folderOptions ,
632+ alwaysSaveActualImage : false ,
633+ } ,
634+ compareOptions : {
635+ ...mockOptions . compareOptions ,
636+ wic : {
637+ ...mockOptions . compareOptions . wic ,
638+ createJsonReportFiles : true ,
639+ saveAboveTolerance : 0.1 ,
640+ } ,
641+ } ,
642+ }
643+
644+ await executeImageCompare ( {
645+ isViewPortScreenshot : true ,
646+ isNativeContext : false ,
647+ options : optionsWithJsonButNoSave ,
648+ testContext : mockTestContext ,
649+ actualBase64Image : Buffer . from ( 'base64-image' ) . toString ( 'base64' ) ,
650+ } )
651+
652+ expect ( logWarnSpy ) . toHaveBeenCalled ( )
653+ expect ( createCompareReport . createJsonReportIfNeeded ) . toHaveBeenCalledWith ( expect . objectContaining ( {
654+ imageCompareOptions : expect . objectContaining ( { createJsonReportFiles : false } ) ,
655+ } ) )
656+ } )
657+
658+ it ( 'should save base64 actual for auto-saved baseline' , async ( ) => {
659+ const base64Image = Buffer . from ( 'base64-image' ) . toString ( 'base64' )
660+ const optionsWithAutoSave = {
661+ ...mockOptions ,
662+ folderOptions : {
663+ ...mockOptions . folderOptions ,
664+ alwaysSaveActualImage : false ,
665+ autoSaveBaseline : true ,
666+ }
667+ }
668+ vi . mocked ( compareImages . default ) . mockResolvedValue ( {
669+ rawMisMatchPercentage : 0 ,
670+ misMatchPercentage : 0 ,
671+ getBuffer : vi . fn ( ) . mockResolvedValue ( Buffer . from ( 'diff-image-data' ) ) ,
672+ diffBounds : { left : 0 , top : 0 , right : 0 , bottom : 0 } ,
673+ analysisTime : 10 ,
674+ diffPixels : [ ]
675+ } )
676+
677+ await executeImageCompare ( {
678+ isViewPortScreenshot : true ,
679+ isNativeContext : false ,
680+ options : optionsWithAutoSave ,
681+ testContext : mockTestContext ,
682+ actualBase64Image : base64Image ,
683+ } )
684+
685+ expect ( fsPromises . writeFile ) . toHaveBeenCalledWith ( '/mock/actual/test.png' , Buffer . from ( base64Image , 'base64' ) )
686+ } )
687+
688+ it ( 'should save base64 actual on diff when not always saving' , async ( ) => {
689+ const base64Image = Buffer . from ( 'base64-image' ) . toString ( 'base64' )
690+ const optionsWithDiff = {
691+ ...mockOptions ,
692+ folderOptions : {
693+ ...mockOptions . folderOptions ,
694+ alwaysSaveActualImage : false ,
695+ }
696+ }
697+ vi . mocked ( compareImages . default ) . mockResolvedValue ( {
698+ rawMisMatchPercentage : 0.5 ,
699+ misMatchPercentage : 0.5 ,
700+ getBuffer : vi . fn ( ) . mockResolvedValue ( Buffer . from ( 'diff-image-data' ) ) ,
701+ diffBounds : { left : 0 , top : 0 , right : 0 , bottom : 0 } ,
702+ analysisTime : 10 ,
703+ diffPixels : [ ]
704+ } )
705+
706+ await executeImageCompare ( {
707+ isViewPortScreenshot : true ,
708+ isNativeContext : false ,
709+ options : optionsWithDiff ,
710+ testContext : mockTestContext ,
711+ actualBase64Image : base64Image ,
712+ } )
713+
714+ expect ( fsPromises . writeFile ) . toHaveBeenCalledWith ( '/mock/actual/test.png' , Buffer . from ( base64Image , 'base64' ) )
715+ } )
716+
717+ it ( 'should update baseline using base64 when visual baseline is updated' , async ( ) => {
718+ const base64Image = Buffer . from ( 'base64-image' ) . toString ( 'base64' )
719+ vi . mocked ( utils . updateVisualBaseline ) . mockReturnValueOnce ( true )
720+ const optionsWithUpdate = {
721+ ...mockOptions ,
722+ folderOptions : {
723+ ...mockOptions . folderOptions ,
724+ alwaysSaveActualImage : false ,
725+ }
726+ }
727+ vi . mocked ( compareImages . default ) . mockResolvedValue ( {
728+ rawMisMatchPercentage : 0 ,
729+ misMatchPercentage : 0 ,
730+ getBuffer : vi . fn ( ) . mockResolvedValue ( Buffer . from ( 'diff-image-data' ) ) ,
731+ diffBounds : { left : 0 , top : 0 , right : 0 , bottom : 0 } ,
732+ analysisTime : 10 ,
733+ diffPixels : [ ]
734+ } )
735+
736+ await executeImageCompare ( {
737+ isViewPortScreenshot : true ,
738+ isNativeContext : false ,
739+ options : optionsWithUpdate ,
740+ testContext : mockTestContext ,
741+ actualBase64Image : base64Image ,
742+ } )
743+
744+ expect ( writeFileSync ) . toHaveBeenCalledWith ( '/mock/baseline/test.png' , Buffer . from ( base64Image , 'base64' ) )
745+ } )
746+
591747 it ( 'should handle Android device pixel ratio correctly' , async ( ) => {
592748 const androidOptions = {
593749 ...mockOptions ,
0 commit comments