|
16 | 16 | // |
17 | 17 | #endregion |
18 | 18 |
|
| 19 | +usingSystem.Collections.Generic; |
| 20 | + |
| 21 | +usingFluentMigrator.Expressions; |
| 22 | +usingFluentMigrator.Model; |
19 | 23 | usingFluentMigrator.Runner.Generators.SqlServer; |
20 | 24 | usingFluentMigrator.SqlServer; |
21 | 25 |
|
@@ -223,5 +227,170 @@ public override void CanUpdateDataWithDbNullCriteria() |
223 | 227 | varresult=Generator.Generate(expression); |
224 | 228 | result.ShouldBe("UPDATE [dbo].[TestTable1] SET [Name] = N'Just''in', [Age] = 25 WHERE [Id] = 9 AND [Homepage] IS NULL;"); |
225 | 229 | } |
| 230 | + |
| 231 | +[Test] |
| 232 | +publicvoidCanDeleteDataWithRawSqlSubquery() |
| 233 | +{ |
| 234 | +// Test the backward compatibility case: RawSql with a subquery should add "= " operator |
| 235 | +varexpression=newDeleteDataExpression |
| 236 | +{ |
| 237 | +TableName="RolePermissions" |
| 238 | +}; |
| 239 | +expression.Rows.Add(newDeletionDataDefinition |
| 240 | +{ |
| 241 | +newKeyValuePair<string,object>("PermissionId",RawSql.Insert("(SELECT [Id] FROM [dbo].[Permissions] WHERE [Name] = 'Foo')")) |
| 242 | +}); |
| 243 | + |
| 244 | +varresult=Generator.Generate(expression); |
| 245 | +result.ShouldBe("DELETE FROM [dbo].[RolePermissions] WHERE [PermissionId] = (SELECT [Id] FROM [dbo].[Permissions] WHERE [Name] = 'Foo');"); |
| 246 | +} |
| 247 | + |
| 248 | +[Test] |
| 249 | +publicvoidCanDeleteDataWithRawSqlExplicitOperator() |
| 250 | +{ |
| 251 | +// Test the new syntax where operator is explicitly included in RawSql |
| 252 | +varexpression=newDeleteDataExpression |
| 253 | +{ |
| 254 | +TableName="TestTable" |
| 255 | +}; |
| 256 | +expression.Rows.Add(newDeletionDataDefinition |
| 257 | +{ |
| 258 | +newKeyValuePair<string,object>("Status",RawSql.Insert("= 3")) |
| 259 | +}); |
| 260 | + |
| 261 | +varresult=Generator.Generate(expression); |
| 262 | +result.ShouldBe("DELETE FROM [dbo].[TestTable] WHERE [Status] = 3;"); |
| 263 | +} |
| 264 | + |
| 265 | +[Test] |
| 266 | +publicvoidCanDeleteDataWithRawSqlIsNull() |
| 267 | +{ |
| 268 | +// Test RawSql with IS NULL operator |
| 269 | +varexpression=newDeleteDataExpression |
| 270 | +{ |
| 271 | +TableName="TestTable" |
| 272 | +}; |
| 273 | +expression.Rows.Add(newDeletionDataDefinition |
| 274 | +{ |
| 275 | +newKeyValuePair<string,object>("Status",RawSql.Insert("IS NULL")) |
| 276 | +}); |
| 277 | + |
| 278 | +varresult=Generator.Generate(expression); |
| 279 | +result.ShouldBe("DELETE FROM [dbo].[TestTable] WHERE [Status] IS NULL;"); |
| 280 | +} |
| 281 | + |
| 282 | +[Test] |
| 283 | +publicvoidCanDeleteDataWithRawSqlInClause() |
| 284 | +{ |
| 285 | +// Test RawSql with IN clause with space |
| 286 | +varexpression=newDeleteDataExpression |
| 287 | +{ |
| 288 | +TableName="TestTable" |
| 289 | +}; |
| 290 | +expression.Rows.Add(newDeletionDataDefinition |
| 291 | +{ |
| 292 | +newKeyValuePair<string,object>("Status",RawSql.Insert("IN (1, 2, 3)")) |
| 293 | +}); |
| 294 | + |
| 295 | +varresult=Generator.Generate(expression); |
| 296 | +result.ShouldBe("DELETE FROM [dbo].[TestTable] WHERE [Status] IN (1, 2, 3);"); |
| 297 | +} |
| 298 | + |
| 299 | +[Test] |
| 300 | +publicvoidCanDeleteDataWithRawSqlInClauseNoSpace() |
| 301 | +{ |
| 302 | +// Test RawSql with IN clause without space after IN |
| 303 | +varexpression=newDeleteDataExpression |
| 304 | +{ |
| 305 | +TableName="TestTable" |
| 306 | +}; |
| 307 | +expression.Rows.Add(newDeletionDataDefinition |
| 308 | +{ |
| 309 | +newKeyValuePair<string,object>("Status",RawSql.Insert("IN(1, 2, 3)")) |
| 310 | +}); |
| 311 | + |
| 312 | +varresult=Generator.Generate(expression); |
| 313 | +result.ShouldBe("DELETE FROM [dbo].[TestTable] WHERE [Status] IN(1, 2, 3);"); |
| 314 | +} |
| 315 | + |
| 316 | +[Test] |
| 317 | +publicvoidCanDeleteDataWithRawSqlFullWhereClause() |
| 318 | +{ |
| 319 | +// Test RawSql as full WHERE clause (empty key) |
| 320 | +varexpression=newDeleteDataExpression |
| 321 | +{ |
| 322 | +TableName="TestTable" |
| 323 | +}; |
| 324 | +expression.Rows.Add(newDeletionDataDefinition |
| 325 | +{ |
| 326 | +newKeyValuePair<string,object>("",RawSql.Insert("Status = 1 AND Active = 0")) |
| 327 | +}); |
| 328 | + |
| 329 | +varresult=Generator.Generate(expression); |
| 330 | +result.ShouldBe("DELETE FROM [dbo].[TestTable] WHERE Status = 1 AND Active = 0;"); |
| 331 | +} |
| 332 | + |
| 333 | +[Test] |
| 334 | +publicvoidCanUpdateDataWithRawSqlSubquery() |
| 335 | +{ |
| 336 | +// Test backward compatibility for UPDATE with RawSql subquery in WHERE clause |
| 337 | +varexpression=newUpdateDataExpression |
| 338 | +{ |
| 339 | +TableName="TestTable" |
| 340 | +}; |
| 341 | +expression.Set=newList<KeyValuePair<string,object>> |
| 342 | +{ |
| 343 | +newKeyValuePair<string,object>("Name","Updated") |
| 344 | +}; |
| 345 | +expression.Where=newList<KeyValuePair<string,object>> |
| 346 | +{ |
| 347 | +newKeyValuePair<string,object>("Id",RawSql.Insert("(SELECT MAX(Id) FROM OtherTable)")) |
| 348 | +}; |
| 349 | + |
| 350 | +varresult=Generator.Generate(expression); |
| 351 | +result.ShouldBe("UPDATE [dbo].[TestTable] SET [Name] = N'Updated' WHERE [Id] = (SELECT MAX(Id) FROM OtherTable);"); |
| 352 | +} |
| 353 | + |
| 354 | +[Test] |
| 355 | +publicvoidCanUpdateDataWithRawSqlLikeOperator() |
| 356 | +{ |
| 357 | +// Test RawSql with LIKE operator |
| 358 | +varexpression=newUpdateDataExpression |
| 359 | +{ |
| 360 | +TableName="TestTable" |
| 361 | +}; |
| 362 | +expression.Set=newList<KeyValuePair<string,object>> |
| 363 | +{ |
| 364 | +newKeyValuePair<string,object>("Name","Updated") |
| 365 | +}; |
| 366 | +expression.Where=newList<KeyValuePair<string,object>> |
| 367 | +{ |
| 368 | +newKeyValuePair<string,object>("Name",RawSql.Insert("LIKE 'Test%'")) |
| 369 | +}; |
| 370 | + |
| 371 | +varresult=Generator.Generate(expression); |
| 372 | +result.ShouldBe("UPDATE [dbo].[TestTable] SET [Name] = N'Updated' WHERE [Name] LIKE 'Test%';"); |
| 373 | +} |
| 374 | + |
| 375 | +[Test] |
| 376 | +publicvoidCanUpdateDataWithRawSqlComparisonOperators() |
| 377 | +{ |
| 378 | +// Test RawSql with comparison operators (<, >, <=, >=, <>) |
| 379 | +varexpression=newUpdateDataExpression |
| 380 | +{ |
| 381 | +TableName="TestTable" |
| 382 | +}; |
| 383 | +expression.Set=newList<KeyValuePair<string,object>> |
| 384 | +{ |
| 385 | +newKeyValuePair<string,object>("Status",1) |
| 386 | +}; |
| 387 | +expression.Where=newList<KeyValuePair<string,object>> |
| 388 | +{ |
| 389 | +newKeyValuePair<string,object>("Age",RawSql.Insert("> 18")) |
| 390 | +}; |
| 391 | + |
| 392 | +varresult=Generator.Generate(expression); |
| 393 | +result.ShouldBe("UPDATE [dbo].[TestTable] SET [Status] = 1 WHERE [Age] > 18;"); |
| 394 | +} |
226 | 395 | } |
227 | 396 | } |