UtOpenApiPascalTypes.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. unit UtOpenApiPascalTypes;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, fpjson.schema.types, fpjson.schema.pascaltypes,
  6. fpopenapi.types, fpopenapi.objects, fpopenapi.pascaltypes;
  7. Type
  8. { TTestPascalTypes }
  9. TTestPascalTypes = Class(TTestCase)
  10. private
  11. FAPI: TOpenAPI;
  12. FAPIData: TAPIData;
  13. function AssertService(const Msg: String; aService: TAPIService; const aName: string; aMethods: array of string): TAPIService;
  14. function AssertServiceMethod(const Msg: string; aMethod: TAPIServiceMethod; aParams: array of string; const aResultName,
  15. aBodyName: string): TAPIServiceMethod;
  16. function AssertServiceMethodResult(const Msg: string; aMethod: TAPIServiceMethod; aResultTypeData: TAPITypeData;
  17. const aResultClassName, aResultInterfaceName: string): TAPIServiceMethod;
  18. procedure AssertSimpleComponent(const Msg: String; aType: TAPITypeData);
  19. Public
  20. class procedure AssertEquals(const Msg: string; aExpected, aActual: TPascalType); overload;
  21. function AssertPascalTypeData(const Msg: string; aType: TPascalTypeData; aPascaltype: TPascalType; const aSchemaName, aPascalName: String) : TPascalTypeData;
  22. procedure AssertProperty(Msg: String; aType: TPascalTypeData; aIndex: Integer; const aSchemaName, aPascalName, aPascalTypeName: String; aPascalType: TPascalType; aTypeData: TPascalTypeData);
  23. procedure Load(const aFileName: string);
  24. procedure Setup; override;
  25. procedure TearDown; override;
  26. Property API : TOpenAPI Read FAPI;
  27. Property Data : TAPIData Read FAPIData;
  28. Published
  29. procedure TestHookup;
  30. procedure TestFindService;
  31. procedure TestSimpleComponent;
  32. procedure TestSimpleService;
  33. procedure TestSimpleServiceArrayArgument;
  34. procedure TestDoubleServiceArrayArgument;
  35. procedure TestServiceNoApplicationJSONResponse;
  36. procedure TestServiceNoApplicationJSONRequestBody;
  37. end;
  38. implementation
  39. uses typinfo, fpopenapi.reader;
  40. { TTestPascalTypes }
  41. class procedure TTestPascalTypes.AssertEquals(const Msg : string; aExpected, aActual : TPascalType);
  42. begin
  43. AssertEquals(Msg,GetEnumName(Typeinfo(TPascalType),Ord(aExpected)),
  44. GetEnumName(Typeinfo(TPascalType),Ord(aActual)));
  45. end;
  46. function TTestPascalTypes.AssertPascalTypeData(const Msg: string; aType: TPascalTypeData; aPascaltype: TPascalType;
  47. const aSchemaName, aPascalName: String): TPascalTypeData;
  48. begin
  49. AssertNotNull(Msg+': have type',aType);
  50. AssertEquals(Msg+' Schema name',aSchemaName,aType.SchemaName);
  51. AssertEquals(Msg+' Pascal name',aPascalName,aType.PascalName);
  52. AssertEquals(Msg+' Pascal type',aPascalType,aType.PascalType);
  53. Result:=aType;
  54. end;
  55. procedure TTestPascalTypes.AssertProperty(Msg : String; aType : TPascalTypeData; aIndex : Integer; const aSchemaName,aPascalName,aPascalTypeName : String; aPascalType : TPascalType; aTypeData: TPascalTypeData);
  56. var
  57. lProp : TPascalPropertyData;
  58. begin
  59. AssertNotNull(Msg+': have type',aType);
  60. AssertTrue(Msg+': have properties',aType.PropertyCount>0);
  61. AssertTrue(Msg+': have valid index',aIndex<aType.PropertyCount);
  62. lProp:=aType.Properties[aIndex];
  63. AssertNotNull(Msg+': have property',lProp);
  64. AssertEquals(Msg+': schema name',aSchemaName,lProp.SchemaName);
  65. AssertEquals(Msg+': pascal name',aPascalName,lProp.PascalName);
  66. AssertEquals(Msg+': Pascal type name',aPascalTypeName,lProp.PascalTypeName);
  67. AssertEquals(Msg+': Pascal type',aPascalType,lProp.PropertyType);
  68. AssertSame(Msg+': Type data',aTypeData,lProp.TypeData);
  69. end;
  70. procedure TTestPascalTypes.Setup;
  71. begin
  72. inherited Setup;
  73. FAPI:=TOpenAPI.Create;
  74. FAPIData:=TAPIData.Create(FAPI);
  75. end;
  76. procedure TTestPascalTypes.TearDown;
  77. begin
  78. FreeAndNil(FAPIData);
  79. FreeAndNil(FAPI);
  80. inherited TearDown;
  81. end;
  82. procedure TTestPascalTypes.TestHookup;
  83. begin
  84. AssertNotNull('Have api',API);
  85. AssertNotNull('Have data',Data);
  86. AssertFalse('API empty',API.HasKeyWord(oakComponents) or API.HasKeyWord(oakPaths));
  87. end;
  88. procedure TTestPascalTypes.TestFindService;
  89. var
  90. lService : TAPIService;
  91. begin
  92. lService:=Data.AddService('a');
  93. AssertNotNull('Have service',lService);
  94. AssertSame('Find correct service',lService,Data.FindService('a'));
  95. AssertNull('unexisting service',Data.FindService('ab'));
  96. end;
  97. procedure TTestPascalTypes.AssertSimpleComponent(const Msg : String; aType : TAPITypeData);
  98. begin
  99. AssertNotNull(Msg+': Have type',aType);
  100. AssertEquals(Msg+': Have type name','a',aType.SchemaName);
  101. AssertEquals(Msg+': Have pascal name','Ta',aType.PascalName);
  102. AssertEquals(Msg+': Have 2 properties',2,aType.PropertyCount);
  103. AssertProperty(Msg+': prop b', aType,0,'b','b','string',ptString,Data.ApiNamedTypes['string']);
  104. AssertProperty(Msg+': prop c', aType,1,'c','c','integer',ptInteger,Data.ApiNamedTypes['integer']);
  105. end;
  106. procedure TTestPascalTypes.TestSimpleComponent;
  107. begin
  108. load('simplecomponent');
  109. AssertTrue('Have components',API.HasKeyWord(oakComponents));
  110. Data.CreateDefaultTypeMaps;
  111. Data.CreateDefaultAPITypeMaps(False);
  112. AssertEquals('Have 1 API type',1,Data.TypeCount);
  113. AssertSimpleComponent('First component',Data.APITypes[0]);
  114. end;
  115. function TTestPascalTypes.AssertService(const Msg: String; aService: TAPIService; const aName: string; aMethods: array of string
  116. ): TAPIService;
  117. var
  118. I : integer;
  119. begin
  120. AssertNotNull(Msg+': Have service',aService);
  121. AssertEquals(Msg+': service name',aName,aService.ServiceName);
  122. AssertEquals(Msg+': count',Length(aMethods),aService.MethodCount);
  123. for I:=0 to aService.MethodCount-1 do
  124. AssertEquals(Msg+': method '+IntToStr(I),aMethods[i],aService.Methods[i].MethodName);
  125. Result:=aService;
  126. end;
  127. function TTestPascalTypes.AssertServiceMethod(const Msg: string; aMethod: TAPIServiceMethod; aParams: array of string;
  128. const aResultName, aBodyName: string): TAPIServiceMethod;
  129. var
  130. I : Integer;
  131. begin
  132. AssertNotNull(Msg+': have method',aMethod);
  133. AssertEquals(Msg+': param count',Length(aParams),aMethod.ParamCount);
  134. for I:=0 to aMethod.ParamCount-1 do
  135. AssertEquals(Msg+': param '+IntToStr(I),aParams[I],aMethod.Param[I].Name);
  136. AssertEquals(Msg+': ResultDtoType',aResultName,aMethod.ResultDtoType);
  137. AssertEquals(Msg+': BodyName',aBodyName,aMethod.RequestBodyType);
  138. Result:=aMethod;
  139. end;
  140. function TTestPascalTypes.AssertServiceMethodResult(const Msg: string; aMethod: TAPIServiceMethod; aResultTypeData: TAPITypeData;
  141. const aResultClassName, aResultInterfaceName: string): TAPIServiceMethod;
  142. begin
  143. AssertNotNull(Msg+': have method',aMethod);
  144. AssertEquals(Msg+': ResultClassType',aResultClassName,aMethod.ResultClassType);
  145. AssertEquals(Msg+': ResultInterfaceType',aResultInterfaceName,aMethod.ResultType);
  146. AssertSame(Msg+': BodyName',aResultTypeData,aMethod.ResultDataType);
  147. Result:=aMethod;
  148. end;
  149. procedure TTestPascalTypes.TestSimpleService;
  150. var
  151. lService : TAPIService;
  152. lMethod : TAPIServiceMethod;
  153. begin
  154. load('simpleservice');
  155. AssertTrue('Have components',API.HasKeyWord(oakComponents));
  156. Data.CreateDefaultTypeMaps;
  157. Data.CreateDefaultAPITypeMaps(False);
  158. Data.CreateServiceDefs;
  159. AssertEquals('Have 1 API type',1,Data.TypeCount);
  160. AssertSimpleComponent('First component',Data.APITypes[0]);
  161. AssertEquals('Have 1 service type',1,Data.ServiceCount);
  162. lService:=AssertService('First component',Data.Services[0],'SimpleService',['List']);
  163. lMethod:=AssertServiceMethod('Method List',lService.Methods[0],[],'Ta','');
  164. AssertServiceMethodResult('Method List',lMethod,Data.APITypes[0],'TaObj','Ia');
  165. end;
  166. procedure TTestPascalTypes.TestSimpleServiceArrayArgument;
  167. var
  168. lService : TAPIService;
  169. lMethod : TAPIServiceMethod;
  170. begin
  171. load('simpleservicearray');
  172. AssertTrue('Have components',API.HasKeyWord(oakComponents));
  173. Data.CreateDefaultTypeMaps;
  174. Data.CreateDefaultAPITypeMaps(False);
  175. Data.CreateServiceDefs;
  176. AssertEquals('Have 2 API type',2,Data.TypeCount);
  177. AssertSimpleComponent('First component',Data.APITypes[0]);
  178. AssertPascalTypeData('Element type',Data.APITypes[1],ptArray,'[a]','TaArray');
  179. AssertEquals('Have 1 service def',1,Data.ServiceCount);
  180. lService:=AssertService('First service',Data.Services[0],'SimpleService',['List']);
  181. lMethod:=AssertServiceMethod('Service 0 Method List',lService.Methods[0],[],'TaArray','');
  182. AssertServiceMethodResult('Service 0 Method List',lMethod,Data.APITypes[1],'TaArray','IaArray');
  183. end;
  184. procedure TTestPascalTypes.TestDoubleServiceArrayArgument;
  185. var
  186. lService : TAPIService;
  187. lMethod : TAPIServiceMethod;
  188. begin
  189. load('doubleservicearray');
  190. AssertTrue('Have components',API.HasKeyWord(oakComponents));
  191. Data.CreateDefaultTypeMaps;
  192. Data.CreateDefaultAPITypeMaps(False);
  193. Data.CreateServiceDefs;
  194. AssertEquals('Have 2 API type',2,Data.TypeCount);
  195. AssertSimpleComponent('First component',Data.APITypes[0]);
  196. AssertPascalTypeData('Element type',Data.APITypes[1],ptArray,'[a]','TaArray');
  197. AssertEquals('Have 2 services',2,Data.ServiceCount);
  198. lService:=AssertService('First Service',Data.Services[1],'SimpleService',['List']);
  199. lMethod:=AssertServiceMethod('Service 0 Method List',lService.Methods[0],[],'TaArray','');
  200. AssertServiceMethodResult('Service 0 Method List',lMethod,Data.APITypes[1],'TaArray','IaArray');
  201. lService:=AssertService('second service',Data.Services[0],'Simple2Service',['List2']);
  202. lMethod:=AssertServiceMethod('Service 1 Method List',lService.Methods[0],[],'TaArray','');
  203. AssertServiceMethodResult('service 1 List',lMethod,Data.APITypes[1],'TaArray','IaArray');
  204. end;
  205. procedure TTestPascalTypes.TestServiceNoApplicationJSONResponse;
  206. begin
  207. load('noapplicationjsonresponse');
  208. AssertTrue('Have components',API.HasKeyWord(oakComponents));
  209. Data.CreateDefaultTypeMaps;
  210. Data.CreateDefaultAPITypeMaps(False);
  211. Data.CreateServiceDefs;
  212. AssertEquals('API type count',1,Data.TypeCount);
  213. AssertEquals('Service count',0,Data.ServiceCount);
  214. end;
  215. procedure TTestPascalTypes.TestServiceNoApplicationJSONRequestBody;
  216. begin
  217. load('noapplicationjsonrequestbody');
  218. AssertTrue('Have components',API.HasKeyWord(oakComponents));
  219. Data.CreateDefaultTypeMaps;
  220. Data.CreateDefaultAPITypeMaps(False);
  221. Data.CreateServiceDefs;
  222. AssertEquals('API type count',1,Data.TypeCount);
  223. AssertEquals('Service count',0,Data.ServiceCount);
  224. end;
  225. procedure TTestPascalTypes.Load(const aFileName : string);
  226. var
  227. lReader : TOpenAPIReader;
  228. begin
  229. lReader:=TOpenAPIReader.Create(Nil);
  230. try
  231. lReader.ReadFromFile(API,'data'+PathDelim+aFileName+'.json');
  232. finally
  233. lReader.Free;
  234. end;
  235. end;
  236. initialization
  237. RegisterTest(TTestPascalTypes);
  238. end.