|
@@ -0,0 +1,141 @@
|
|
|
+unit TestSpecificTSqlite3Dataset;
|
|
|
+
|
|
|
+{$mode objfpc}{$H+}
|
|
|
+
|
|
|
+interface
|
|
|
+
|
|
|
+uses
|
|
|
+ Classes, SysUtils, ToolsUnit, Sqlite3DS;
|
|
|
+
|
|
|
+type
|
|
|
+
|
|
|
+ { TTestSpecificTSqlite3Dataset }
|
|
|
+
|
|
|
+ TTestSpecificTSqlite3Dataset = class(TDBBasicsTestCase)
|
|
|
+ private
|
|
|
+ function CreateMemoryDataset: TSqlite3Dataset;
|
|
|
+ protected
|
|
|
+ published
|
|
|
+ procedure TestApplyUpdates;
|
|
|
+ end;
|
|
|
+
|
|
|
+implementation
|
|
|
+
|
|
|
+uses
|
|
|
+ testregistry;
|
|
|
+
|
|
|
+
|
|
|
+{ TTestSpecificTSqlite3Dataset }
|
|
|
+
|
|
|
+function TTestSpecificTSqlite3Dataset.CreateMemoryDataset: TSqlite3Dataset;
|
|
|
+begin
|
|
|
+ Result := TSqlite3Dataset.Create(nil);
|
|
|
+ Result.FileName := ':memory:';
|
|
|
+ Result.TableName := 'Test';
|
|
|
+ Result.PrimaryKey := 'Id';
|
|
|
+ Result.ExecSQL('Create Table Test (Id INTEGER PRIMARY KEY, Name VARCHAR);');
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestSpecificTSqlite3Dataset.TestApplyUpdates;
|
|
|
+var
|
|
|
+ Dataset: TSqlite3Dataset;
|
|
|
+ ExceptionRaised: Boolean;
|
|
|
+begin
|
|
|
+ Dataset := CreateMemoryDataset;
|
|
|
+ try
|
|
|
+ // insert
|
|
|
+ Dataset.Open;
|
|
|
+ CheckEquals(0, Dataset.RecordCount, 'Dataset should be empty');
|
|
|
+ Dataset.Append;
|
|
|
+ Dataset.FieldByName('Name').AsString := 'Luiz';
|
|
|
+ Dataset.Post;
|
|
|
+ Dataset.ApplyUpdates;
|
|
|
+ Dataset.Close;
|
|
|
+ Dataset.Open;
|
|
|
+ CheckEquals(1, Dataset.RecordCount, 'Record count should increase after apply insert updates');
|
|
|
+ CheckEquals('Luiz', Dataset.FieldByName('Name').AsString, 'Record field should be set');
|
|
|
+ // update
|
|
|
+ Dataset.Edit;
|
|
|
+ Dataset.FieldByName('Name').AsString := 'New';
|
|
|
+ Dataset.Post;
|
|
|
+ Dataset.ApplyUpdates;
|
|
|
+ Dataset.Close;
|
|
|
+ Dataset.Open;
|
|
|
+ CheckEquals(1, Dataset.RecordCount, 'Record count should not change after apply update updates');
|
|
|
+ CheckEquals('New', Dataset.FieldByName('Name').AsString, 'Record field should be updated');
|
|
|
+ //delete
|
|
|
+ Dataset.Delete;
|
|
|
+ Dataset.ApplyUpdates;
|
|
|
+ Dataset.Close;
|
|
|
+ Dataset.Open;
|
|
|
+ CheckEquals(0, Dataset.RecordCount, 'Record count should decrease after apply delete updates');
|
|
|
+ finally
|
|
|
+ Dataset.Destroy;
|
|
|
+ end;
|
|
|
+
|
|
|
+ Dataset := CreateMemoryDataset;
|
|
|
+ try
|
|
|
+ Dataset.Open;
|
|
|
+ CheckEquals(0, Dataset.RecordCount, 'Dataset should be empty');
|
|
|
+ Dataset.Append;
|
|
|
+ Dataset.FieldByName('Name').AsString := 'Luiz';
|
|
|
+ Dataset.Post;
|
|
|
+ Dataset.TableName := 'NonExistentTable';
|
|
|
+ ExceptionRaised := False;
|
|
|
+ try
|
|
|
+ Dataset.ApplyUpdates;
|
|
|
+ except
|
|
|
+ ExceptionRaised := True;
|
|
|
+ end;
|
|
|
+ CheckTrue(ExceptionRaised, 'An exception should be raised if TableName is invalid');
|
|
|
+ finally
|
|
|
+ Dataset.Destroy;
|
|
|
+ end;
|
|
|
+
|
|
|
+ Dataset := CreateMemoryDataset;
|
|
|
+ try
|
|
|
+ Dataset.Open;
|
|
|
+ Dataset.Append;
|
|
|
+ Dataset.FieldByName('Name').AsString := 'Luiz';
|
|
|
+ Dataset.Post;
|
|
|
+ Dataset.ApplyUpdates;
|
|
|
+
|
|
|
+ Dataset.Close;
|
|
|
+ Dataset.PrimaryKey := '';
|
|
|
+ Dataset.Open;
|
|
|
+ Dataset.Edit;
|
|
|
+ Dataset.FieldByName('Name').AsString := 'New';
|
|
|
+ Dataset.Post;
|
|
|
+ ExceptionRaised := False;
|
|
|
+ try
|
|
|
+ Dataset.ApplyUpdates;
|
|
|
+ except
|
|
|
+ ExceptionRaised := True;
|
|
|
+ end;
|
|
|
+ CheckTrue(ExceptionRaised, 'An exception should be raised if PrimaryKey is empty');
|
|
|
+
|
|
|
+ Dataset.Close;
|
|
|
+ Dataset.PrimaryKey := 'NonExistingKey';
|
|
|
+ Dataset.Open;
|
|
|
+ Dataset.Edit;
|
|
|
+ Dataset.FieldByName('Name').AsString := 'New';
|
|
|
+ Dataset.Post;
|
|
|
+ ExceptionRaised := False;
|
|
|
+ try
|
|
|
+ Dataset.ApplyUpdates;
|
|
|
+ except
|
|
|
+ ExceptionRaised := True;
|
|
|
+ end;
|
|
|
+ CheckTrue(ExceptionRaised, 'An exception should be raised if PrimaryKey is invalid');
|
|
|
+ finally
|
|
|
+ Dataset.Destroy;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+initialization
|
|
|
+
|
|
|
+ if UpperCase(dbconnectorname) = 'SQLITE3DS' then
|
|
|
+ RegisterTestDecorator(TDBBasicsTestSetup, TTestSpecificTSqlite3Dataset);
|
|
|
+
|
|
|
+end.
|
|
|
+
|