tcdbwidgets.pp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. unit tcdbwidgets;
  2. {$mode objfpc}
  3. interface
  4. uses
  5. Classes, SysUtils, testregistry, dbwebwidget, db, js, jsondataset, tcwidget, web;
  6. Type
  7. { TBaseTestDBWidget }
  8. TBaseTestDBWidget = Class(TBaseTestWidget)
  9. private
  10. FFieldCount: Integer;
  11. FRecordCount: Integer;
  12. FDataset : TDataset;
  13. FDatasource : TDatasource;
  14. function GetDataset: TDataset;
  15. function GetDatasource: TDatasource;
  16. Protected
  17. Procedure SetUp; override;
  18. Procedure TearDown; override;
  19. Public
  20. Class Function CreateDataset(aRecordCount : Integer = 2; aFieldCount : Integer = 2) : TDataset;
  21. Property MyDataset : TDataset Read GetDataset;
  22. Property MyDatasource : TDatasource Read GetDatasource;
  23. Property RecordCount : Integer Read FRecordCount Write FRecordCount;
  24. Property FieldCount : Integer Read FFieldCount Write FFieldCount;
  25. end;
  26. TMyDBLoopTemplateWidget = Class(TDBLoopTemplateWidget);
  27. { TTestSimpleDBloopWidget }
  28. TTestSimpleDBloopWidget = Class(TBaseTestDBWidget)
  29. private
  30. FMy: TMyDBLoopTemplateWidget;
  31. procedure DoFormatField(Sender: TObject; aData: TDBFieldValueData);
  32. Protected
  33. Procedure SetUp; override;
  34. Procedure TearDown; override;
  35. Property My : TMyDBLoopTemplateWidget Read FMy;
  36. Published
  37. Procedure TestSetup;
  38. Procedure TestRender;
  39. Procedure TestFormatField;
  40. end;
  41. implementation
  42. Type
  43. { TMyJSONDataset }
  44. TMyJSONDataset = Class(TJSONDataset)
  45. Protected
  46. Procedure MetaDataToFieldDefs; override;
  47. Public
  48. Property Rows;
  49. end;
  50. { TTestSimpleDBloopWidget }
  51. Const
  52. SSimpleHeader = '<ul>';
  53. SSimpleFooter = '</ul>';
  54. SSimpleItem = '<li id="{{FI1}}">{{FS2}}</li>';
  55. procedure TTestSimpleDBloopWidget.DoFormatField(Sender: TObject; aData: TDBFieldValueData);
  56. begin
  57. if aData.Field.Name='FI1' then
  58. aData.Value:='myf-'+IntToStr(aData.Field.AsInteger);
  59. end;
  60. procedure TTestSimpleDBloopWidget.SetUp;
  61. begin
  62. inherited SetUp;
  63. RecordCount:=3;
  64. FMy:=TMyDBLoopTemplateWidget.Create(Nil);
  65. FMy.ParentID:=SBaseWindowID;
  66. FMy.Datasource:=MyDataSource;
  67. FMy.HeaderTemplate:=SSimpleHeader;
  68. FMy.FooterTemplate:=SSimpleFooter;
  69. FMy.ItemTemplate:=SSimpleItem;
  70. end;
  71. procedure TTestSimpleDBloopWidget.TearDown;
  72. begin
  73. FreeAndNil(FMy);
  74. inherited TearDown;
  75. end;
  76. procedure TTestSimpleDBloopWidget.TestSetup;
  77. begin
  78. AssertEquals('Recordcount',3,RecordCount);
  79. AssertNotNull('Have dataset',My);
  80. AssertNotNull('Have dataset datasource',My.Datasource);
  81. end;
  82. procedure TTestSimpleDBloopWidget.TestRender;
  83. Var
  84. El : TJSHTMLElement;
  85. i : Integer;
  86. begin
  87. My.Refresh;
  88. For I:=1 to 3 do
  89. begin
  90. El:=AssertTree('ul/li('+IntToStr(i)+')');
  91. AssertEquals('Inner text','FS2_'+IntToStr(I),EL.InnerText);
  92. end;
  93. end;
  94. procedure TTestSimpleDBloopWidget.TestFormatField;
  95. Var
  96. El : TJSHTMLElement;
  97. i : Integer;
  98. begin
  99. My.OnFormatField:=@DoFormatField;
  100. My.Refresh;
  101. For I:=1 to 3 do
  102. begin
  103. El:=AssertTree('ul/li('+IntToStr(i)+')');
  104. AssertEquals('Inner text','FS2_'+IntToStr(I),EL.InnerText);
  105. end;
  106. end;
  107. { TMyJSONDataset }
  108. procedure TMyJSONDataset.MetaDataToFieldDefs;
  109. begin
  110. // Do nothing
  111. end;
  112. function TBaseTestDBWidget.GetDataset: TDataset;
  113. begin
  114. if FDataset=Nil then
  115. FDataset:=CreateDataset(FRecordCount,FFieldCount);
  116. Result:=FDataset;
  117. end;
  118. function TBaseTestDBWidget.GetDatasource: TDatasource;
  119. begin
  120. if FDatasource=Nil then
  121. begin
  122. FDatasource:=TDatasource.Create(Nil);
  123. FDatasource.Dataset:=MyDataset;
  124. end;
  125. Result:=FDatasource;
  126. end;
  127. procedure TBaseTestDBWidget.SetUp;
  128. begin
  129. inherited SetUp;
  130. FRecordCount:=2;
  131. FFieldCount:=2;
  132. end;
  133. procedure TBaseTestDBWidget.TearDown;
  134. begin
  135. FreeAndNil(FDatasource);
  136. FreeAndNil(FDataset);
  137. inherited TearDown;
  138. end;
  139. class function TBaseTestDBWidget.CreateDataset(aRecordCount : Integer = 2; aFieldCount : Integer = 2) : TDataset;
  140. Var
  141. JD : TMyJSONDataset;
  142. I,J : integer;
  143. O : TJSObject;
  144. A : TJSArray;
  145. begin
  146. JD:=TMyJSONDataSet.Create(Nil);
  147. Result:=JD;
  148. JD.FieldDefs.Add('FI1',ftInteger);
  149. For I:=2 to aFieldCount do
  150. JD.FieldDefs.Add('FS'+IntToStr(I),ftString,100);
  151. JD.RowType:=rtJSONObject;
  152. A:=TJSArray.New;
  153. For J:=1 to aRecordCount do
  154. begin
  155. O:=TJSObject.New;
  156. A.Push(O);
  157. O['FI1']:=J;
  158. For I:=2 to aFieldCount do
  159. O['FS'+IntToStr(I)]:='FS'+IntToStr(I)+'_'+IntToStr(J);
  160. end;
  161. JD.Rows:=A;
  162. JD.Open;
  163. end;
  164. begin
  165. // RegisterTests([TTestSimpleDBloopWidget]);
  166. end.