Browse Source

* Additional tests for sqlite3dataset by Luis Americo (bug ID 323247)

git-svn-id: trunk@42945 -
michael 5 years ago
parent
commit
ff0887b9b3

+ 1 - 0
.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

+ 4 - 0
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,

+ 1 - 0
packages/fcl-db/tests/dbtestframework_gui.lpr

@@ -26,6 +26,7 @@ uses
   SdfDSToolsUnit,
 {$IFDEF TEST_SQLITE3DS}
   Sqlite3DSToolsUnit,
+  TestSpecificTSqlite3Dataset,
 {$ENDIF}
   // DB unittest
   TestBasics,

+ 2 - 3
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.
+end.

+ 141 - 0
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.
+