1- import { createSentryBuildPluginManager } from "../src/build-plugin-manager" ;
1+ import {
2+ createSentryBuildPluginManager ,
3+ _resetDeployedReleasesForTesting ,
4+ } from "../src/build-plugin-manager" ;
25import fs from "fs" ;
36import { glob } from "glob" ;
47import { prepareBundleForDebugIdUpload } from "../src/debug-id-upload" ;
58
69const mockCliExecute = jest . fn ( ) ;
710const mockCliUploadSourceMaps = jest . fn ( ) ;
11+ const mockCliNewDeploy = jest . fn ( ) ;
812
913jest . mock ( "@sentry/cli" , ( ) => {
1014 return jest . fn ( ) . mockImplementation ( ( ) => ( {
@@ -14,7 +18,7 @@ jest.mock("@sentry/cli", () => {
1418 new : jest . fn ( ) ,
1519 finalize : jest . fn ( ) ,
1620 setCommits : jest . fn ( ) ,
17- newDeploy : jest . fn ( ) ,
21+ newDeploy : mockCliNewDeploy ,
1822 } ,
1923 } ) ) ;
2024} ) ;
@@ -633,4 +637,136 @@ describe("createSentryBuildPluginManager", () => {
633637 } ) ;
634638 } ) ;
635639 } ) ;
640+
641+ describe ( "createRelease deploy deduplication" , ( ) => {
642+ beforeEach ( ( ) => {
643+ jest . clearAllMocks ( ) ;
644+ _resetDeployedReleasesForTesting ( ) ;
645+ } ) ;
646+
647+ it ( "should create a deploy record on the first call" , async ( ) => {
648+ const manager = createSentryBuildPluginManager (
649+ {
650+ authToken : "test-token" ,
651+ org : "test-org" ,
652+ project : "test-project" ,
653+ release : {
654+ name : "test-release" ,
655+ deploy : { env : "production" } ,
656+ } ,
657+ } ,
658+ { buildTool : "webpack" , loggerPrefix : "[sentry-webpack-plugin]" }
659+ ) ;
660+
661+ await manager . createRelease ( ) ;
662+
663+ expect ( mockCliNewDeploy ) . toHaveBeenCalledTimes ( 1 ) ;
664+ expect ( mockCliNewDeploy ) . toHaveBeenCalledWith ( "test-release" , { env : "production" } ) ;
665+ } ) ;
666+
667+ it ( "should not create duplicate deploy records when createRelease is called multiple times on the same instance" , async ( ) => {
668+ const manager = createSentryBuildPluginManager (
669+ {
670+ authToken : "test-token" ,
671+ org : "test-org" ,
672+ project : "test-project" ,
673+ release : {
674+ name : "test-release" ,
675+ deploy : { env : "production" } ,
676+ } ,
677+ } ,
678+ { buildTool : "webpack" , loggerPrefix : "[sentry-webpack-plugin]" }
679+ ) ;
680+
681+ await manager . createRelease ( ) ;
682+ await manager . createRelease ( ) ;
683+ await manager . createRelease ( ) ;
684+
685+ expect ( mockCliNewDeploy ) . toHaveBeenCalledTimes ( 1 ) ;
686+ } ) ;
687+
688+ it ( "should not create duplicate deploy records across separate plugin instances with the same release name" , async ( ) => {
689+ const managerA = createSentryBuildPluginManager (
690+ {
691+ authToken : "test-token" ,
692+ org : "test-org" ,
693+ project : "test-project" ,
694+ release : {
695+ name : "test-release" ,
696+ deploy : { env : "production" } ,
697+ } ,
698+ } ,
699+ { buildTool : "webpack" , loggerPrefix : "[sentry-webpack-plugin]" }
700+ ) ;
701+
702+ const managerB = createSentryBuildPluginManager (
703+ {
704+ authToken : "test-token" ,
705+ org : "test-org" ,
706+ project : "test-project" ,
707+ release : {
708+ name : "test-release" ,
709+ deploy : { env : "production" } ,
710+ } ,
711+ } ,
712+ { buildTool : "webpack" , loggerPrefix : "[sentry-webpack-plugin]" }
713+ ) ;
714+
715+ await managerA . createRelease ( ) ;
716+ await managerB . createRelease ( ) ;
717+
718+ expect ( mockCliNewDeploy ) . toHaveBeenCalledTimes ( 1 ) ;
719+ } ) ;
720+
721+ it ( "should allow deploys for different release names" , async ( ) => {
722+ const managerA = createSentryBuildPluginManager (
723+ {
724+ authToken : "test-token" ,
725+ org : "test-org" ,
726+ project : "test-project" ,
727+ release : {
728+ name : "release-1" ,
729+ deploy : { env : "production" } ,
730+ } ,
731+ } ,
732+ { buildTool : "webpack" , loggerPrefix : "[sentry-webpack-plugin]" }
733+ ) ;
734+
735+ const managerB = createSentryBuildPluginManager (
736+ {
737+ authToken : "test-token" ,
738+ org : "test-org" ,
739+ project : "test-project" ,
740+ release : {
741+ name : "release-2" ,
742+ deploy : { env : "production" } ,
743+ } ,
744+ } ,
745+ { buildTool : "webpack" , loggerPrefix : "[sentry-webpack-plugin]" }
746+ ) ;
747+
748+ await managerA . createRelease ( ) ;
749+ await managerB . createRelease ( ) ;
750+
751+ expect ( mockCliNewDeploy ) . toHaveBeenCalledTimes ( 2 ) ;
752+ expect ( mockCliNewDeploy ) . toHaveBeenCalledWith ( "release-1" , { env : "production" } ) ;
753+ expect ( mockCliNewDeploy ) . toHaveBeenCalledWith ( "release-2" , { env : "production" } ) ;
754+ } ) ;
755+
756+ it ( "should not create a deploy when deploy option is not set" , async ( ) => {
757+ const manager = createSentryBuildPluginManager (
758+ {
759+ authToken : "test-token" ,
760+ org : "test-org" ,
761+ project : "test-project" ,
762+ release : { name : "test-release" } ,
763+ } ,
764+ { buildTool : "webpack" , loggerPrefix : "[sentry-webpack-plugin]" }
765+ ) ;
766+
767+ await manager . createRelease ( ) ;
768+
769+ expect ( mockCliNewDeploy ) . not . toHaveBeenCalled ( ) ;
770+ } ) ;
771+ } ) ;
636772} ) ;
0 commit comments