Advertisement
Guest User

TestMasterDetailOf_mORMot

a guest
Feb 3rd, 2020
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.85 KB | None | 0 0
  1. program TestMasterDetail;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. // comment this line to switch to TSQLRestServerFullMemory
  6. // or we will use TSQLRestServerDB.
  7. {$DEFINE USE_SQLITE3}
  8.  
  9. uses
  10.   SysUtils,
  11.   SynCommons,                            
  12.   {$IFDEF USE_SQLITE3}SynSQLite3Static,{$ENDIF}
  13.   SynTests,
  14.   mORMot
  15.   {$IFDEF USE_SQLITE3},mORMotSQLite3{$ENDIF};
  16.  
  17. type
  18.   // some DTO
  19.   TMaster = packed record
  20.     MasterName: String;
  21.   end;
  22.   TMasters = array of TMaster;
  23.   TDetail = packed record
  24.     Master: TMaster;
  25.     DetailName: String;
  26.   end;
  27.   TDetails = array of TDetail;
  28.  
  29.   // first class - to be referenced.
  30.   TSQLRecordMaster=class(TSQLRecord)
  31.   private
  32.     fDummyName: RawUTF8;
  33.   published
  34.     property DummyName: RawUTF8 read fDummyName write fDummyName;
  35.   end;
  36.  
  37.   // second class - references first one.
  38.   TSQLRecordDetail=class(TSQLRecord)
  39.   private
  40.     fMaster: TID;
  41.     fDummyName: RawUTF8;
  42.   published
  43.     property Master: TID read fMaster write fMaster;
  44.     property DummyName: RawUTF8 read fDummyName write fDummyName;
  45.   end;
  46.  
  47.   TDummyService=class
  48.   private
  49.     fModel: TSQLModel;
  50.     fRest: TSQLRestServer;
  51.   public
  52.     constructor Create;
  53.     destructor Destroy; override;
  54.  
  55.     procedure MasterAdd(aMaster: TMaster);
  56.     procedure MasterRemove(aMaster: TMaster);
  57.     function MasterGet(out aMasters: TMasters): Integer;
  58.  
  59.     procedure DetailAdd(aMaster: TMaster; aDetail: TDetail);
  60.     procedure DetailRemove(aMaster: TMaster; aDetail: TDetail);
  61.     function DetailGet(aMaster: TMaster; out aDetails: TDetails): Integer;
  62.  
  63.     procedure ClearAll;
  64.   end;
  65.  
  66.   TTestDummyService=class(TSynTestCase)
  67.   private
  68.     fService: TDummyService;
  69.   published
  70.     procedure SetupAll;
  71.  
  72.     procedure TestMasterAddGetRemove;
  73.     procedure TestDetailAddGetRemove;
  74.  
  75.     procedure TeardownAll;
  76.   end;
  77.  
  78.   TTestMasterDetailMode=class(TSynTests)
  79.   published
  80.     procedure TestAll;
  81.   end;
  82.  
  83. { TDummyService }
  84.  
  85. procedure TDummyService.ClearAll;
  86. begin
  87.   fRest.Delete(TSQLRecordDetail, '');
  88.   fRest.Delete(TSQLRecordMaster, '');
  89. end;
  90.  
  91. constructor TDummyService.Create;
  92. begin
  93.   inherited;
  94.   fModel := TSQLModel.Create([TSQLRecordMaster, TSQLRecordDetail]);
  95.   {$IFDEF USE_SQLITE3}
  96.   fRest := TSQLRestServerDB.Create(fModel);
  97.   {$ELSE}
  98.   fRest := TSQLRestServerFullMemory.Create(fModel,
  99.     ChangeFileExt(ExeVersion.ProgramName, '.json'));
  100.   {$ENDIF}
  101.   fRest.CreateMissingTables;
  102. end;
  103.  
  104. destructor TDummyService.Destroy;
  105. begin
  106.   fRest.Free;
  107.   fModel.Free;
  108.   inherited;
  109. end;
  110.  
  111. procedure TDummyService.DetailAdd(aMaster: TMaster; aDetail: TDetail);
  112. var
  113.   qMaster: TSQLRecordMaster;
  114.   qDetail: TSQLRecordDetail;
  115. begin
  116.   with TSQLRecordMaster.AutoFree(qMaster,fRest,'DummyName=?',
  117.     [aMaster.MasterName]) do
  118.     if qMaster.FillOne then
  119.       with TSQLRecordDetail.AutoFree(qDetail,fRest,'Master=? and DummyName=?',
  120.         [qMaster.ID,aDetail.DetailName]) do
  121.         if not qDetail.FillOne then
  122.         begin
  123.           qDetail.Master := qMaster.ID;
  124.           qDetail.DummyName := aDetail.DetailName;
  125.           fRest.Add(qDetail, True);
  126.         end;
  127. end;
  128.  
  129. function TDummyService.DetailGet(aMaster: TMaster; out aDetails: TDetails):
  130.     Integer;
  131. var
  132.   qMaster: TSQLRecordMaster;
  133.   qDetail: TSQLRecordDetail;
  134. begin
  135.   Result := 0;
  136.   with TSQLRecordMaster.AutoFree(qMaster,fRest,'DummyName=?',
  137.     [aMaster.MasterName]) do
  138.     if qMaster.FillOne then
  139.       with TSQLRecordDetail.AutoFree(qDetail,fRest,'Master=?',
  140.         [qMaster.ID]) do
  141.         while qDetail.FillOne do   // always jump to the end
  142.         begin
  143.           SetLength(aDetails, Result+1);
  144.           aDetails[Result].Master := aMaster;
  145.           aDetails[Result].DetailName := qDetail.DummyName;
  146.           Inc(Result);
  147.         end;
  148. end;
  149.  
  150. procedure TDummyService.DetailRemove(aMaster: TMaster; aDetail: TDetail);
  151. var
  152.   qMaster: TSQLRecordMaster;
  153.   qDetail: TSQLRecordDetail;
  154. begin
  155.   with TSQLRecordMaster.AutoFree(qMaster,fRest,'DummyName=?',
  156.     [aMaster.MasterName]) do
  157.     if qMaster.FillOne then          
  158.       with TSQLRecordDetail.AutoFree(qDetail,fRest,'Master=? and DummyName=?',
  159.         [qMaster.ID,aDetail.DetailName]) do
  160.         if qDetail.FillOne then
  161.           fRest.Delete(TSQLRecordDetail, qDetail.ID);
  162. end;
  163.  
  164. procedure TDummyService.MasterAdd(aMaster: TMaster);
  165. var
  166.   qMaster: TSQLRecordMaster;
  167. begin
  168.   with TSQLRecordMaster.AutoFree(qMaster, fRest, 'DummyName=?',
  169.     [aMaster.MasterName]) do
  170.     if not qMaster.FillOne then
  171.     begin
  172.       qMaster.DummyName := aMaster.MasterName;
  173.       fRest.Add(qMaster, True);
  174.     end;
  175. end;
  176.  
  177. function TDummyService.MasterGet(out aMasters: TMasters): Integer;
  178. var
  179.   qMaster: TSQLRecordMaster;
  180. begin
  181.   Result := 0;
  182.   with TSQLRecordMaster.AutoFree(qMaster, fRest, '',  []) do
  183.     while qMaster.FillOne do
  184.     begin
  185.       SetLength(aMasters, Result + 1);
  186.       aMasters[Result].MasterName := qMaster.DummyName;
  187.       Inc(Result);
  188.     end;
  189. end;
  190.  
  191. procedure TDummyService.MasterRemove(aMaster: TMaster);
  192. var
  193.   qMaster: TSQLRecordMaster;
  194. begin
  195.   with TSQLRecordMaster.AutoFree(qMaster, fRest, 'DummyName=?',
  196.     [aMaster.MasterName]) do
  197.     if qMaster.FillOne then
  198.       fRest.Delete(TSQLRecordMaster, qMaster.ID);
  199. end;
  200.  
  201. { TTestDummyService }
  202.  
  203. procedure TTestDummyService.SetupAll;
  204. begin
  205.   fService := TDummyService.Create;
  206. end;
  207.  
  208. procedure TTestDummyService.TeardownAll;
  209. begin
  210.   fService.ClearAll;
  211.   fService.Free;
  212. end;
  213.  
  214. procedure TTestDummyService.TestDetailAddGetRemove;
  215. const
  216.   TestMasterName='This is Master';
  217.   TestDetailName1='This is detail No.1';
  218.   TestDetailName2='This is detail No.2';
  219.   TestDetailNameNotExist='I''m not here.';
  220. var
  221.   oMaster: TMaster;
  222.   oMastersGot: TMasters;
  223.   oDetail: TDetail;
  224.   oDetailsGot: TDetails;
  225. begin
  226.   if CheckFailed(nil <> fService) then Exit;
  227.  
  228.   oMaster.MasterName := TestMasterName;
  229.   fService.MasterAdd(oMaster);
  230.   Check(1=fService.MasterGet(oMastersGot));
  231.  
  232.   Check(0=fService.DetailGet(oMaster, oDetailsGot));
  233.   oDetail.Master := oMaster;
  234.   oDetail.DetailName := TestDetailName1;
  235.   fService.DetailAdd(oMaster, oDetail);
  236.   Check(1=fService.DetailGet(oMaster, oDetailsGot));
  237.   oDetail.DetailName := TestDetailName2;
  238.   fService.DetailAdd(oMaster, oDetail);
  239.   Check(2=fService.DetailGet(oMaster, oDetailsGot));
  240.  
  241.   oDetail.DetailName:=TestDetailNameNotExist;
  242.   fService.DetailRemove(oMaster, oDetail);
  243.   Check(2=fService.DetailGet(oMaster, oDetailsGot));
  244.   oDetail.DetailName := TestDetailName1;
  245.   fService.DetailRemove(oMaster, oDetail);
  246.   Check(1=fService.DetailGet(oMaster, oDetailsGot));
  247. end;
  248.  
  249. procedure TTestDummyService.TestMasterAddGetRemove;
  250. const
  251.   TestMasterName1='Hello,world';
  252.   TestMasterName2='Hello,world,again';
  253.   TestMasterNameError='error';
  254. var
  255.   oMaster: TMaster;
  256.   oMastersGot: TMasters;
  257. begin
  258.   if CheckFailed(nil <> fService) then Exit;
  259.  
  260.   Check(0=fService.MasterGet(oMastersGot));
  261.   oMaster.MasterName:=TestMasterName1;        
  262.   fService.MasterAdd(oMaster);
  263.   Check(1=fService.MasterGet(oMastersGot));
  264.   Check(TestMasterName1=oMastersGot[0].MasterName);
  265.   oMaster.MasterName:=TestMasterName2;
  266.   fService.MasterAdd(oMaster);
  267.   Check(2=fService.MasterGet(oMastersGot));
  268.  
  269.   oMaster.MasterName:=TestMasterName1;
  270.   fService.MasterRemove(oMaster);
  271.   Check(1=fService.MasterGet(oMastersGot));
  272.  
  273.   oMaster.MasterName:=TestMasterNameError;
  274.   fService.MasterRemove(oMaster);
  275.   Check(1=fService.MasterGet(oMastersGot));
  276.  
  277.   oMaster.MasterName:=TestMasterName2;
  278.   fService.MasterRemove(oMaster);
  279.   Check(0=fService.MasterGet(oMastersGot));
  280. end;
  281.  
  282. { TTestMasterDetailMode }
  283.  
  284. procedure TTestMasterDetailMode.TestAll;
  285. begin
  286.   AddCase([TTestDummyService]);
  287. end;
  288.  
  289. begin
  290.   with TTestMasterDetailMode.Create() do
  291.   try
  292.     Run;
  293.     ReadLn;
  294.   finally
  295.     Free;
  296.   end;
  297. //  try
  298. //    { TODO -oUser -cConsole Main : Insert code here }
  299. //  except
  300. //    on E: Exception do
  301. //      Writeln(E.ClassName, ': ', E.Message);
  302. //  end;
  303. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement