@@ -36,7 +36,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
36
36
await dbContext . ClearTablesAsync < Performer , MusicTrack > ( ) ;
37
37
} ) ;
38
38
39
- string performerId = Unknown . StringId . For < Performer , int > ( ) ;
39
+ string unknownPerformerId = Unknown . StringId . For < Performer , int > ( ) ;
40
40
41
41
var requestBody = new
42
42
{
@@ -74,7 +74,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
74
74
new
75
75
{
76
76
type = "performers" ,
77
- id = performerId
77
+ id = unknownPerformerId
78
78
}
79
79
}
80
80
}
@@ -97,7 +97,87 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
97
97
ErrorObject error = responseDocument . Errors [ 0 ] ;
98
98
error . StatusCode . Should ( ) . Be ( HttpStatusCode . NotFound ) ;
99
99
error . Title . Should ( ) . Be ( "A related resource does not exist." ) ;
100
- error . Detail . Should ( ) . Be ( $ "Related resource of type 'performers' with ID '{ performerId } ' in relationship 'performers' does not exist.") ;
100
+ error . Detail . Should ( ) . Be ( $ "Related resource of type 'performers' with ID '{ unknownPerformerId } ' in relationship 'performers' does not exist.") ;
101
+ error . Source . ShouldNotBeNull ( ) ;
102
+ error . Source . Pointer . Should ( ) . Be ( "/atomic:operations[1]" ) ;
103
+
104
+ await _testContext . RunOnDatabaseAsync ( async dbContext =>
105
+ {
106
+ List < Performer > performersInDatabase = await dbContext . Performers . ToListAsync ( ) ;
107
+ performersInDatabase . Should ( ) . BeEmpty ( ) ;
108
+
109
+ List < MusicTrack > tracksInDatabase = await dbContext . MusicTracks . ToListAsync ( ) ;
110
+ tracksInDatabase . Should ( ) . BeEmpty ( ) ;
111
+ } ) ;
112
+ }
113
+
114
+ [ Fact ]
115
+ public async Task Can_restore_to_previous_savepoint_on_error ( )
116
+ {
117
+ // Arrange
118
+ string newTrackTitle = _fakers . MusicTrack . Generate ( ) . Title ;
119
+
120
+ await _testContext . RunOnDatabaseAsync ( async dbContext =>
121
+ {
122
+ await dbContext . ClearTablesAsync < Performer , MusicTrack > ( ) ;
123
+ } ) ;
124
+
125
+ const string trackLid = "track-1" ;
126
+
127
+ string unknownPerformerId = Unknown . StringId . For < Performer , int > ( ) ;
128
+
129
+ var requestBody = new
130
+ {
131
+ atomic__operations = new object [ ]
132
+ {
133
+ new
134
+ {
135
+ op = "add" ,
136
+ data = new
137
+ {
138
+ type = "musicTracks" ,
139
+ lid = trackLid ,
140
+ attributes = new
141
+ {
142
+ title = newTrackTitle
143
+ }
144
+ }
145
+ } ,
146
+ new
147
+ {
148
+ op = "add" ,
149
+ @ref = new
150
+ {
151
+ type = "musicTracks" ,
152
+ lid = trackLid ,
153
+ relationship = "performers"
154
+ } ,
155
+ data = new [ ]
156
+ {
157
+ new
158
+ {
159
+ type = "performers" ,
160
+ id = unknownPerformerId
161
+ }
162
+ }
163
+ }
164
+ }
165
+ } ;
166
+
167
+ const string route = "/operations" ;
168
+
169
+ // Act
170
+ ( HttpResponseMessage httpResponse , Document responseDocument ) = await _testContext . ExecutePostAtomicAsync < Document > ( route , requestBody ) ;
171
+
172
+ // Assert
173
+ httpResponse . Should ( ) . HaveStatusCode ( HttpStatusCode . NotFound ) ;
174
+
175
+ responseDocument . Errors . ShouldHaveCount ( 1 ) ;
176
+
177
+ ErrorObject error = responseDocument . Errors [ 0 ] ;
178
+ error . StatusCode . Should ( ) . Be ( HttpStatusCode . NotFound ) ;
179
+ error . Title . Should ( ) . Be ( "A related resource does not exist." ) ;
180
+ error . Detail . Should ( ) . Be ( $ "Related resource of type 'performers' with ID '{ unknownPerformerId } ' in relationship 'performers' does not exist.") ;
101
181
error . Source . ShouldNotBeNull ( ) ;
102
182
error . Source . Pointer . Should ( ) . Be ( "/atomic:operations[1]" ) ;
103
183
0 commit comments