Advertisement
Guest User

TestMasterDetail

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