diff --git a/.gitattributes b/.gitattributes index a0f83a80b9..067c085835 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3429,6 +3429,7 @@ packages/fcl-db/tests/testleaks.sh svneol=native#text/plain packages/fcl-db/tests/testspecifictbufdataset.pas svneol=native#text/plain packages/fcl-db/tests/testspecifictdbf.pas svneol=native#text/plain packages/fcl-db/tests/testspecifictmemdataset.pas svneol=native#text/pascal +packages/fcl-db/tests/testspecifictsqlite3dataset.pp svneol=native#text/plain packages/fcl-db/tests/testsqldb.pas svneol=native#text/pascal packages/fcl-db/tests/testsqlfiles.lpi svneol=native#text/plain packages/fcl-db/tests/testsqlfiles.lpr svneol=native#text/plain diff --git a/packages/fcl-db/tests/dbtestframework.pas b/packages/fcl-db/tests/dbtestframework.pas index 6ed6f44777..3071c5d137 100644 --- a/packages/fcl-db/tests/dbtestframework.pas +++ b/packages/fcl-db/tests/dbtestframework.pas @@ -17,6 +17,10 @@ uses bufdatasettoolsunit, memdstoolsunit, SdfDSToolsUnit, + {$IFDEF TEST_SQLITE3DS} + Sqlite3DSToolsUnit, + TestSpecificTSqlite3Dataset, + {$ENDIF} // Units wich contain the tests tcsdfdata, TestBasics, diff --git a/packages/fcl-db/tests/dbtestframework_gui.lpr b/packages/fcl-db/tests/dbtestframework_gui.lpr index 3d866a3643..620494ac4a 100644 --- a/packages/fcl-db/tests/dbtestframework_gui.lpr +++ b/packages/fcl-db/tests/dbtestframework_gui.lpr @@ -26,6 +26,7 @@ uses SdfDSToolsUnit, {$IFDEF TEST_SQLITE3DS} Sqlite3DSToolsUnit, + TestSpecificTSqlite3Dataset, {$ENDIF} // DB unittest TestBasics, diff --git a/packages/fcl-db/tests/sqlite3dstoolsunit.pas b/packages/fcl-db/tests/sqlite3dstoolsunit.pas index 550739897b..52c4f5f82c 100644 --- a/packages/fcl-db/tests/sqlite3dstoolsunit.pas +++ b/packages/fcl-db/tests/sqlite3dstoolsunit.pas @@ -119,8 +119,7 @@ begin FieldByName('FMEMO').AsString := testStringValues[i]; Post; end; - if not ApplyUpdates then - raise Exception.Create('Error in ApplyUpdates: ' + FieldDataset.ReturnString); + ApplyUpdates; Destroy; end; except @@ -200,4 +199,4 @@ end; initialization RegisterClass(TSqlite3DSDBConnector); -end. \ No newline at end of file +end. diff --git a/packages/fcl-db/tests/testspecifictsqlite3dataset.pp b/packages/fcl-db/tests/testspecifictsqlite3dataset.pp new file mode 100644 index 0000000000..b653bf86c8 --- /dev/null +++ b/packages/fcl-db/tests/testspecifictsqlite3dataset.pp @@ -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. +