12
12
using Exceptionless . Core . Queues . Models ;
13
13
using Exceptionless . Core . Repositories ;
14
14
using Exceptionless . Core . Repositories . Configuration ;
15
+ using Exceptionless . Core . Utility ;
15
16
using Exceptionless . DateTimeExtensions ;
16
17
using Exceptionless . Tests . Utility ;
17
18
using Foundatio . Repositories ;
@@ -929,7 +930,7 @@ public async Task WillHandleDiscardedStack()
929
930
var organization = OrganizationData . GenerateSampleOrganization ( _billingManager , _plans ) ;
930
931
var project = ProjectData . GenerateSampleProject ( ) ;
931
932
932
- var ev = EventData . GenerateEvent ( organizationId : TestConstants . OrganizationId , projectId : TestConstants . ProjectId , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
933
+ var ev = EventData . GenerateEvent ( organizationId : organization . Id , projectId : project . Id , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
933
934
var context = await _pipeline . RunAsync ( ev , organization , project ) ;
934
935
Assert . True ( context . IsProcessed ) ;
935
936
Assert . False ( context . HasError ) ;
@@ -944,22 +945,101 @@ public async Task WillHandleDiscardedStack()
944
945
stack . Status = StackStatus . Discarded ;
945
946
stack = await _stackRepository . SaveAsync ( stack , o => o . ImmediateConsistency ( ) ) ;
946
947
947
-
948
- ev = EventData . GenerateEvent ( organizationId : TestConstants . OrganizationId , projectId : TestConstants . ProjectId , stackId : ev . StackId , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
948
+ ev = EventData . GenerateEvent ( organizationId : organization . Id , projectId : project . Id , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
949
949
context = await _pipeline . RunAsync ( ev , organization , project ) ;
950
950
Assert . False ( context . IsProcessed ) ;
951
951
Assert . False ( context . HasError ) ;
952
952
Assert . True ( context . IsCancelled ) ;
953
953
Assert . True ( context . IsDiscarded ) ;
954
954
await RefreshDataAsync ( ) ;
955
955
956
- ev = EventData . GenerateEvent ( organizationId : TestConstants . OrganizationId , projectId : TestConstants . ProjectId , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
956
+ ev = EventData . GenerateEvent ( organizationId : organization . Id , projectId : project . Id , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
957
957
context = await _pipeline . RunAsync ( ev , organization , project ) ;
958
958
Assert . False ( context . IsProcessed ) ;
959
959
Assert . False ( context . HasError ) ;
960
960
Assert . True ( context . IsCancelled ) ;
961
961
Assert . True ( context . IsDiscarded ) ;
962
+ }
963
+
964
+ [ Theory ]
965
+ [ InlineData ( StackStatus . Regressed , false , null , null ) ]
966
+ [ InlineData ( StackStatus . Fixed , true , "1.0.0" , null ) ] // A fixed stack should not be marked as regressed if the event has no version.
967
+ [ InlineData ( StackStatus . Regressed , false , null , "1.0.0" ) ]
968
+ [ InlineData ( StackStatus . Regressed , false , "1.0.0" , "1.0.0" ) ] // A fixed stack should not be marked as regressed if the event has the same version.
969
+ [ InlineData ( StackStatus . Fixed , true , "2.0.0" , "1.0.0" ) ]
970
+ [ InlineData ( StackStatus . Regressed , false , null , "1.0.1" ) ]
971
+ [ InlineData ( StackStatus . Regressed , false , "1.0.0" , "1.0.1" ) ]
972
+ public async Task CanDiscardStackEventsBasedOnEventVersion ( StackStatus expectedStatus , bool expectedDiscard , string ? stackFixedInVersion , string ? eventSemanticVersion )
973
+ {
974
+ var organization = await _organizationRepository . GetByIdAsync ( TestConstants . OrganizationId , o => o . Cache ( ) ) ;
975
+ var project = await _projectRepository . GetByIdAsync ( TestConstants . ProjectId , o => o . Cache ( ) ) ;
976
+
977
+ var ev = EventData . GenerateEvent ( organizationId : organization . Id , projectId : project . Id , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
978
+ var context = await _pipeline . RunAsync ( ev , organization , project ) ;
979
+
980
+ var stack = context . Stack ;
981
+ Assert . NotNull ( stack ) ;
982
+ Assert . Equal ( StackStatus . Open , stack . Status ) ;
983
+
984
+ Assert . True ( context . IsProcessed ) ;
985
+ Assert . False ( context . HasError ) ;
986
+ Assert . False ( context . IsCancelled ) ;
987
+ Assert . False ( context . IsDiscarded ) ;
988
+
989
+ var semanticVersionParser = GetService < SemanticVersionParser > ( ) ;
990
+ var fixedInVersion = semanticVersionParser . Parse ( stackFixedInVersion ) ;
991
+ stack . MarkFixed ( fixedInVersion ) ;
992
+ await _stackRepository . SaveAsync ( stack , o => o . ImmediateConsistency ( ) ) ;
993
+
994
+ await RefreshDataAsync ( ) ;
995
+ ev = EventData . GenerateEvent ( organizationId : organization . Id , projectId : project . Id , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow , semver : eventSemanticVersion ) ;
996
+ context = await _pipeline . RunAsync ( ev , organization , project ) ;
997
+
998
+ stack = context . Stack ;
999
+ Assert . NotNull ( stack ) ;
1000
+ Assert . Equal ( expectedStatus , stack . Status ) ;
1001
+ Assert . Equal ( expectedDiscard , context . IsCancelled ) ;
1002
+ Assert . Equal ( expectedDiscard , context . IsDiscarded ) ;
1003
+ }
1004
+
1005
+ [ Theory ]
1006
+ [ InlineData ( "1.0.0" , null ) ] // A fixed stack should not be marked as regressed if the event has no version.
1007
+ [ InlineData ( "2.0.0" , "1.0.0" ) ]
1008
+ public async Task WillNotDiscardStackEventsBasedOnEventVersionWithFreePlan ( string stackFixedInVersion , string ? eventSemanticVersion )
1009
+ {
1010
+ var organization = await _organizationRepository . GetByIdAsync ( TestConstants . OrganizationId3 , o => o . Cache ( ) ) ;
1011
+
1012
+ var plans = GetService < BillingPlans > ( ) ;
1013
+ Assert . Equal ( plans . FreePlan . Id , organization . PlanId ) ;
1014
+
1015
+ var project = await _projectRepository . AddAsync ( ProjectData . GenerateProject ( organizationId : organization . Id ) , o => o . ImmediateConsistency ( ) . Cache ( ) ) ;
1016
+
1017
+ var ev = EventData . GenerateEvent ( organizationId : organization . Id , projectId : project . Id , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow ) ;
1018
+ var context = await _pipeline . RunAsync ( ev , organization , project ) ;
1019
+
1020
+ var stack = context . Stack ;
1021
+ Assert . NotNull ( stack ) ;
1022
+ Assert . Equal ( StackStatus . Open , stack . Status ) ;
1023
+
1024
+ Assert . True ( context . IsProcessed ) ;
1025
+ Assert . False ( context . HasError ) ;
1026
+ Assert . False ( context . IsCancelled ) ;
1027
+ Assert . False ( context . IsDiscarded ) ;
1028
+
1029
+ var semanticVersionParser = GetService < SemanticVersionParser > ( ) ;
1030
+ var fixedInVersion = semanticVersionParser . Parse ( stackFixedInVersion ) ;
1031
+ stack . MarkFixed ( fixedInVersion ) ;
1032
+ await _stackRepository . SaveAsync ( stack , o => o . ImmediateConsistency ( ) ) ;
1033
+
962
1034
await RefreshDataAsync ( ) ;
1035
+ ev = EventData . GenerateEvent ( organizationId : organization . Id , projectId : project . Id , type : Event . KnownTypes . Log , source : "test" , occurrenceDate : SystemClock . OffsetNow , semver : eventSemanticVersion ) ;
1036
+ context = await _pipeline . RunAsync ( ev , organization , project ) ;
1037
+
1038
+ stack = context . Stack ;
1039
+ Assert . NotNull ( stack ) ;
1040
+ Assert . Equal ( StackStatus . Fixed , stack . Status ) ;
1041
+ Assert . False ( context . IsCancelled ) ;
1042
+ Assert . False ( context . IsDiscarded ) ;
963
1043
}
964
1044
965
1045
[ Theory ]
0 commit comments