testspecifictsqlite3dataset.pp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. unit TestSpecificTSqlite3Dataset;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, ToolsUnit, Sqlite3DS;
  6. type
  7. { TTestSpecificTSqlite3Dataset }
  8. TTestSpecificTSqlite3Dataset = class(TDBBasicsTestCase)
  9. private
  10. function CreateMemoryDataset: TSqlite3Dataset;
  11. protected
  12. published
  13. procedure TestApplyUpdates;
  14. end;
  15. implementation
  16. uses
  17. testregistry;
  18. { TTestSpecificTSqlite3Dataset }
  19. function TTestSpecificTSqlite3Dataset.CreateMemoryDataset: TSqlite3Dataset;
  20. begin
  21. Result := TSqlite3Dataset.Create(nil);
  22. Result.FileName := ':memory:';
  23. Result.TableName := 'Test';
  24. Result.PrimaryKey := 'Id';
  25. Result.ExecSQL('Create Table Test (Id INTEGER PRIMARY KEY, Name VARCHAR);');
  26. end;
  27. procedure TTestSpecificTSqlite3Dataset.TestApplyUpdates;
  28. var
  29. Dataset: TSqlite3Dataset;
  30. ExceptionRaised: Boolean;
  31. begin
  32. Dataset := CreateMemoryDataset;
  33. try
  34. // insert
  35. Dataset.Open;
  36. CheckEquals(0, Dataset.RecordCount, 'Dataset should be empty');
  37. Dataset.Append;
  38. Dataset.FieldByName('Name').AsString := 'Luiz';
  39. Dataset.Post;
  40. Dataset.ApplyUpdates;
  41. Dataset.Close;
  42. Dataset.Open;
  43. CheckEquals(1, Dataset.RecordCount, 'Record count should increase after apply insert updates');
  44. CheckEquals('Luiz', Dataset.FieldByName('Name').AsString, 'Record field should be set');
  45. // update
  46. Dataset.Edit;
  47. Dataset.FieldByName('Name').AsString := 'New';
  48. Dataset.Post;
  49. Dataset.ApplyUpdates;
  50. Dataset.Close;
  51. Dataset.Open;
  52. CheckEquals(1, Dataset.RecordCount, 'Record count should not change after apply update updates');
  53. CheckEquals('New', Dataset.FieldByName('Name').AsString, 'Record field should be updated');
  54. //delete
  55. Dataset.Delete;
  56. Dataset.ApplyUpdates;
  57. Dataset.Close;
  58. Dataset.Open;
  59. CheckEquals(0, Dataset.RecordCount, 'Record count should decrease after apply delete updates');
  60. finally
  61. Dataset.Destroy;
  62. end;
  63. Dataset := CreateMemoryDataset;
  64. try
  65. Dataset.Open;
  66. CheckEquals(0, Dataset.RecordCount, 'Dataset should be empty');
  67. Dataset.Append;
  68. Dataset.FieldByName('Name').AsString := 'Luiz';
  69. Dataset.Post;
  70. Dataset.TableName := 'NonExistentTable';
  71. ExceptionRaised := False;
  72. try
  73. Dataset.ApplyUpdates;
  74. except
  75. ExceptionRaised := True;
  76. end;
  77. CheckTrue(ExceptionRaised, 'An exception should be raised if TableName is invalid');
  78. finally
  79. Dataset.Destroy;
  80. end;
  81. Dataset := CreateMemoryDataset;
  82. try
  83. Dataset.Open;
  84. Dataset.Append;
  85. Dataset.FieldByName('Name').AsString := 'Luiz';
  86. Dataset.Post;
  87. Dataset.ApplyUpdates;
  88. Dataset.Close;
  89. Dataset.PrimaryKey := '';
  90. Dataset.Open;
  91. Dataset.Edit;
  92. Dataset.FieldByName('Name').AsString := 'New';
  93. Dataset.Post;
  94. ExceptionRaised := False;
  95. try
  96. Dataset.ApplyUpdates;
  97. except
  98. ExceptionRaised := True;
  99. end;
  100. CheckTrue(ExceptionRaised, 'An exception should be raised if PrimaryKey is empty');
  101. Dataset.Close;
  102. Dataset.PrimaryKey := 'NonExistingKey';
  103. Dataset.Open;
  104. Dataset.Edit;
  105. Dataset.FieldByName('Name').AsString := 'New';
  106. Dataset.Post;
  107. ExceptionRaised := False;
  108. try
  109. Dataset.ApplyUpdates;
  110. except
  111. ExceptionRaised := True;
  112. end;
  113. CheckTrue(ExceptionRaised, 'An exception should be raised if PrimaryKey is invalid');
  114. finally
  115. Dataset.Destroy;
  116. end;
  117. end;
  118. initialization
  119. if UpperCase(dbconnectorname) = 'SQLITE3DS' then
  120. RegisterTestDecorator(TDBBasicsTestSetup, TTestSpecificTSqlite3Dataset);
  121. end.