fpc/packages/fcl-web/tests/testsqldbopenapi.pas
2024-11-18 23:02:36 +01:00

285 lines
8.8 KiB
ObjectPascal

unit testsqldbopenapi;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, fpcunit, testregistry, fpjson, fpjson.schema.types, fpjson.schema.schema,
fpopenapi.types, fpopenapi.objects, sqldbrestschema, sqldbrestopenapi, fpopenapi.writer,
jsonwriter;
Type
{ TTestSQLDBRestOpenAPI }
TTestSQLDBRestOpenAPI = class(TTestCase)
private
FConverter: TSLQDBRestSchemaToOpenAPI;
FOpenAPI: TOpenAPI;
FSchema: TSQLDBRestSchema;
protected
procedure AssertGetOperation(aComponent: String);
procedure AssertPostOperation(aComponent: String);
procedure AssertListComponent(aComponent: string);
procedure AssertListOperation(aComponent: String);
procedure AssertSimpleComponent(aComponent: string; aExtraProperty: TSchemaSimpleType=sstNone);
procedure Convert;
function CreateResource(withID: boolean; aSecondFieldType: TRestFieldType): TSQLDBRestResource;
Public
Procedure SetUp; override;
Procedure TearDown; override;
Property Converter : TSLQDBRestSchemaToOpenAPI Read FConverter;
Property OpenAPI : TOpenAPI Read FOpenAPI;
Property Schema : TSQLDBRestSchema Read FSchema;
Published
Procedure TestHookup;
procedure TestResourceReadOnly;
procedure TestResourceReadOnlyWithID;
procedure TestResourcePostOnly;
end;
implementation
{ TTestSQLDBRestOpenAPI }
procedure TTestSQLDBRestOpenAPI.SetUp;
begin
inherited SetUp;
FConverter:=TSLQDBRestSchemaToOpenAPI.Create(Nil);
FOpenAPI:=TOpenAPI.Create;
FSchema:=TSQLDBRestSchema.Create(Nil);
end;
procedure TTestSQLDBRestOpenAPI.TearDown;
begin
FreeAndNil(FSchema);
FreeAndNil(FOpenAPI);
FreeAndNil(FConverter);
inherited TearDown;
end;
procedure TTestSQLDBRestOpenAPI.TestHookup;
begin
AssertNotNull('Have converter',Converter);
end;
function TTestSQLDBRestOpenAPI.CreateResource(withID : boolean; aSecondFieldType: TRestFieldType) : TSQLDBRestResource;
var
lField : TSQLDBRestField;
begin
Result:=Schema.Resources.AddResource('simple','simple');
lField:=Result.Fields.AddField('id',rftInteger,[]);
if WithID then
lField.Options:=lField.Options+[foInKey];
if aSecondFieldType<>rftUnknown then
Result.Fields.AddField('b',aSecondFieldType,[]);
end;
procedure TTestSQLDBRestOpenAPI.Convert;
var
Writer : TOpenAPIWriter;
J : TJSONDataWriter;
D : TJSONData;
begin
Converter.Convert(Schema,OpenAPI);
Writer:=TOpenAPIWriter.Create(Nil);
J:=TJSONDataWriter.Create;
try
Writer.Write(OpenAPI,J);
Writeln(TestName,' OpenAPI:');
D:=J.ExtractData;
Writeln(D.FormatJSON);
finally
D.Free;
J.Free;
end;
end;
procedure TTestSQLDBRestOpenAPI.AssertGetOperation(aComponent : String);
var
lPath : TPathItem;
Op : TAPIOperation;
Res : TResponse;
lMedia : TMediaType;
begin
lPath:=OpenAPI.Paths[aComponent+'/{ID}'];
AssertNotNull('have '+aComponent+'/{ID} path',lPath);
AssertTrue('Get Operation',lPath.HasKeyWord(pkGet));
OP:=lPath.Get;
AssertEquals('Get OperationID','Get'+aComponent,OP.OperationId);
AssertEquals('response count',1, OP.Responses.Count);
AssertNotNull('Get default response',OP.Responses['default']);
AssertEquals('response count',1, OP.Responses.Count);
Res:=OP.Responses['default'];
AssertNotNull('Have default response',Res);
AssertTrue('Havemedia count',Res.HasKeyWord(rkContent));
lMedia:=Res.Content.MediaTypes['application/json'];
AssertNotNull('Have media',lMedia);
AssertTrue('Have schema',lMedia.HasKeyWord(mtkSchema));
AssertEquals('Have component ref','#components/schema/'+aComponent,lMedia.Schema.Ref);
end;
procedure TTestSQLDBRestOpenAPI.AssertPostOperation(aComponent: String);
var
lPath : TPathItem;
Op : TAPIOperation;
Res : TResponse;
lMedia : TMediaType;
begin
lPath:=OpenAPI.Paths[aComponent];
AssertNotNull('have '+aComponent+' path',lPath);
AssertTrue('Post Operation',lPath.HasKeyWord(pkPost));
OP:=lPath.Post;
AssertEquals('Get OperationID','Create'+aComponent,OP.OperationId);
AssertEquals('response count',1, OP.Responses.Count);
AssertNotNull('Get default response',OP.Responses['default']);
AssertEquals('response count',1, OP.Responses.Count);
Res:=OP.Responses['default'];
AssertNotNull('Have default response',Res);
AssertTrue('Havemedia count',Res.HasKeyWord(rkContent));
lMedia:=Res.Content.MediaTypes['application/json'];
AssertNotNull('Have media',lMedia);
AssertTrue('Have schema',lMedia.HasKeyWord(mtkSchema));
AssertEquals('Have component ref','#components/schema/'+aComponent,lMedia.Schema.Ref);
end;
procedure TTestSQLDBRestOpenAPI.AssertListOperation(aComponent : String);
var
lPath : TPathItem;
Op : TAPIOperation;
Res : TResponse;
lMedia : TMediaType;
begin
lPath:=OpenAPI.Paths[aComponent];
AssertNotNull('have '+acomponent+' path',lPath);
AssertTrue('Get Operation',lPath.HasKeyWord(pkGet));
OP:=lPath.Get;
AssertEquals('Get OperationID','List'+aComponent,OP.OperationId);
AssertEquals('response count',1, OP.Responses.Count);
AssertNotNull('Get default response',OP.Responses['default']);
AssertEquals('response count',1, OP.Responses.Count);
Res:=OP.Responses['default'];
AssertNotNull('Have default response',Res);
AssertTrue('Havemedia count',Res.HasKeyWord(rkContent));
lMedia:=Res.Content.MediaTypes['application/json'];
AssertNotNull('Have media',lMedia);
AssertTrue('Have schema',lMedia.HasKeyWord(mtkSchema));
AssertEquals('Have component ref','#components/schema/'+aComponent+'List',lMedia.Schema.Ref);
end;
Procedure TTestSQLDBRestOpenAPI.AssertSimpleComponent(aComponent : string; aExtraProperty : TSchemaSimpleType = sstNone);
var
S,el : TJSONSchema;
begin
AssertTrue('Components',OpenAPI.HasKeyWord(oakComponents));
AssertTrue('Components.Schemas',OpenAPI.Components.HasKeyWord(ckSchemas));
S:=OpenAPI.Components.Schemas[aComponent];
AssertNotNull('Component '+aComponent+' Schema',S);
AssertTrue(aComponent+' is array',S.Validations.Types=[sstObject]);
AssertEquals(aComponent+' property count',1+Ord(aExtraProperty<>sstNone),S.properties.Count);
el:=S.Properties[0];
AssertNotNull(aComponent+'property 0 is valid',el);
AssertEquals(aComponent+'property 0 is valid','id',el.Name);
AssertTrue(aComponent+'property id type',el.Validations.Types=[sstInteger]);
if aExtraProperty<>sstNone then
begin
el:=S.Properties[1];
AssertNotNull(aComponent+'property 1 is valid',el);
AssertEquals(aComponent+'property 1 is valid','b',el.Name);
AssertTrue(aComponent+'property b type',el.Validations.Types=[aExtraProperty]);
end
end;
Procedure TTestSQLDBRestOpenAPI.AssertListComponent(aComponent : string);
var
S,el : TJSONSchema;
begin
AssertTrue('Components',OpenAPI.HasKeyWord(oakComponents));
AssertTrue('Components.Schemas',OpenAPI.Components.HasKeyWord(ckSchemas));
S:=OpenAPI.Components.Schemas[aComponent+'List'];
AssertNotNull('Component '+aComponent+'List Schema',S);
AssertTrue(aComponent+' is array',S.Validations.Types=[sstArray]);
AssertTrue(aComponent+' has 1 item',S.items.Count=1);
el:=S.Items[0];
AssertNotNull(aComponent+' item is valid',el);
AssertEquals(aComponent+' reference to component','#components/schemas/'+aComponent,el.ref);
end;
procedure TTestSQLDBRestOpenAPI.TestResourceReadOnly;
var
R : TSQLDBRestResource;
begin
R:=CreateResource(False,rftUnknown);
R.AllowedOperations:=[roGet];
Convert;
AssertTrue('Component schemas',OpenAPI.Components.HasKeyWord(ckSchemas));
AssertEquals('Component Count',2, OpenAPI.Components.Schemas.Count);
AssertSimpleComponent('simple');
AssertListComponent('simple');
AssertTrue('PathItems',OpenAPI.HasKeyWord(oakPaths));
AssertEquals('Path Count',1, OpenAPI.Paths.Count);
AssertListOperation('simple');
end;
procedure TTestSQLDBRestOpenAPI.TestResourceReadOnlyWithID;
var
R : TSQLDBRestResource;
begin
R:=CreateResource(True,rftUnknown);
R.AllowedOperations:=[roGet];
Convert;
AssertTrue('Components',OpenAPI.HasKeyWord(oakComponents));
AssertTrue('Component schemas',OpenAPI.Components.HasKeyWord(ckSchemas));
AssertEquals('Component Count',2, OpenAPI.Components.Schemas.Count);
AssertSimpleComponent('simple');
AssertListComponent('simple');
AssertTrue('PathItems',OpenAPI.HasKeyWord(oakPaths));
AssertEquals('Path Count',2, OpenAPI.Paths.Count);
AssertListOperation('simple');
AssertGetOperation('simple');
end;
procedure TTestSQLDBRestOpenAPI.TestResourcePostOnly;
var
R : TSQLDBRestResource;
begin
R:=CreateResource(True,rftUnknown);
R.AllowedOperations:=[roPost];
Convert;
AssertTrue('Components',OpenAPI.HasKeyWord(oakComponents));
AssertTrue('Component schemas',OpenAPI.Components.HasKeyWord(ckSchemas));
AssertEquals('Component Count',1, OpenAPI.Components.Schemas.Count);
AssertSimpleComponent('simple');
// AssertListComponent('simple');
AssertTrue('PathItems',OpenAPI.HasKeyWord(oakPaths));
AssertEquals('Path Count',1, OpenAPI.Paths.Count);
AssertPostOperation('simple');
end;
initialization
RegisterTest(TTestSQLDBRestOpenAPI);
end.