2013-10-30 01:09:09 +01:00
|
|
|
|
unit LiveServerTestU;
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
TestFramework,
|
|
|
|
|
MVCFramework.RESTClient;
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
TBaseServerTest = class(TTestCase)
|
|
|
|
|
protected
|
|
|
|
|
RESTClient: TRESTClient;
|
|
|
|
|
procedure DoLoginWith(UserName: string);
|
|
|
|
|
procedure DoLogout;
|
|
|
|
|
|
|
|
|
|
protected
|
|
|
|
|
procedure SetUp; override;
|
|
|
|
|
procedure TearDown; override;
|
|
|
|
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
TServerTest = class(TBaseServerTest)
|
|
|
|
|
published
|
|
|
|
|
procedure TestReqWithParams;
|
|
|
|
|
procedure TestPOSTWithParamsAndJSONBody;
|
2014-03-24 17:37:08 +01:00
|
|
|
|
// procedure TestPATCHWithParamsAndJSONBody;
|
2013-11-18 00:44:40 +01:00
|
|
|
|
procedure TestPOSTWithObjectJSONBody;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
procedure TestPUTWithParamsAndJSONBody;
|
|
|
|
|
procedure TestSession;
|
|
|
|
|
procedure TestAsynchRequestPOST;
|
|
|
|
|
procedure TestAsynchRequestPUT;
|
|
|
|
|
procedure TestAsynchRequestGET;
|
|
|
|
|
procedure TestAsynchRequestDELETE;
|
2013-11-05 14:57:50 +01:00
|
|
|
|
procedure TestEncodingRenderJSONValue;
|
2013-11-09 14:22:11 +01:00
|
|
|
|
|
|
|
|
|
procedure TestProducesConsumes01;
|
|
|
|
|
procedure TestProducesConsumes02;
|
2013-12-05 16:19:01 +01:00
|
|
|
|
procedure TestExceptionInMVCAfterCreate;
|
|
|
|
|
procedure TestExceptionInMVCBeforeDestroy;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
Data.DBXJSON,
|
|
|
|
|
MVCFramework.Commons,
|
|
|
|
|
System.SyncObjs,
|
2013-11-18 00:44:40 +01:00
|
|
|
|
System.SysUtils, BusinessObjectsU, ObjectsMappers;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
|
|
|
|
|
{ TServerTest }
|
|
|
|
|
|
|
|
|
|
procedure TBaseServerTest.DoLogout;
|
|
|
|
|
var
|
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
res := RESTClient.doGET('/logout', []);
|
|
|
|
|
CheckTrue(res.ResponseCode = 200, 'Logout Failed');
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TBaseServerTest.SetUp;
|
|
|
|
|
begin
|
|
|
|
|
inherited;
|
2014-02-24 10:20:34 +01:00
|
|
|
|
RESTClient := TRESTClient.Create('localhost', 9999);
|
2013-10-30 01:09:09 +01:00
|
|
|
|
RESTClient.ReadTimeout := 60 * 1000 * 30;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TBaseServerTest.TearDown;
|
|
|
|
|
begin
|
|
|
|
|
inherited;
|
|
|
|
|
RESTClient.Free;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestAsynchRequestDELETE;
|
|
|
|
|
var
|
|
|
|
|
evt: TEvent;
|
2013-11-05 14:57:50 +01:00
|
|
|
|
r: TWaitResult;
|
|
|
|
|
ok: boolean;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
|
|
|
|
ok := false;
|
|
|
|
|
evt := TEvent.Create;
|
|
|
|
|
try
|
|
|
|
|
RESTClient.Asynch(
|
2013-11-09 14:22:11 +01:00
|
|
|
|
procedure(Response: IRESTResponse)
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
2013-11-09 14:22:11 +01:00
|
|
|
|
ok := true;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
evt.SetEvent;
|
2013-11-09 14:22:11 +01:00
|
|
|
|
end,
|
|
|
|
|
procedure(E: Exception)
|
|
|
|
|
begin
|
|
|
|
|
ok := false;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
end).doDELETE('/req/with/params', ['1', '2', '3']);
|
|
|
|
|
|
|
|
|
|
// wait for thred finish
|
|
|
|
|
repeat
|
|
|
|
|
r := evt.WaitFor(2000);
|
|
|
|
|
until r = TWaitResult.wrSignaled;
|
|
|
|
|
|
|
|
|
|
CheckEquals(true, ok);
|
|
|
|
|
finally
|
|
|
|
|
evt.Free;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestAsynchRequestGET;
|
|
|
|
|
var
|
|
|
|
|
evt: TEvent;
|
2013-11-05 14:57:50 +01:00
|
|
|
|
r: TWaitResult;
|
|
|
|
|
j: TJSONObject;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
|
|
|
|
j := nil;
|
|
|
|
|
evt := TEvent.Create;
|
|
|
|
|
try
|
|
|
|
|
RESTClient.Asynch(
|
2013-11-09 14:22:11 +01:00
|
|
|
|
procedure(Response: IRESTResponse)
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
|
|
|
|
try
|
2013-11-09 14:22:11 +01:00
|
|
|
|
j := Response.BodyAsJsonObject.Clone as TJSONObject;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
except
|
|
|
|
|
// test should not block...never!
|
|
|
|
|
end;
|
|
|
|
|
evt.SetEvent;
|
2013-11-09 14:22:11 +01:00
|
|
|
|
end,
|
|
|
|
|
procedure(E: Exception)
|
|
|
|
|
begin
|
2013-10-30 01:09:09 +01:00
|
|
|
|
end).doGET('/req/with/params', ['1', '2', '3']);
|
|
|
|
|
|
|
|
|
|
// wait for thred finish
|
|
|
|
|
repeat
|
|
|
|
|
r := evt.WaitFor(2000);
|
|
|
|
|
until r = TWaitResult.wrSignaled;
|
|
|
|
|
|
|
|
|
|
CheckTrue(Assigned(j));
|
|
|
|
|
CheckEquals('1', j.Get('par1').JsonValue.Value);
|
|
|
|
|
j.Free;
|
|
|
|
|
finally
|
|
|
|
|
evt.Free;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestAsynchRequestPOST;
|
|
|
|
|
var
|
|
|
|
|
evt: TEvent;
|
2013-11-05 14:57:50 +01:00
|
|
|
|
r: TWaitResult;
|
|
|
|
|
j: TJSONObject;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
|
|
|
|
j := nil;
|
|
|
|
|
evt := TEvent.Create;
|
|
|
|
|
try
|
|
|
|
|
RESTClient.Asynch(
|
2013-11-09 14:22:11 +01:00
|
|
|
|
procedure(Response: IRESTResponse)
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
|
|
|
|
try
|
2013-11-09 14:22:11 +01:00
|
|
|
|
j := Response.BodyAsJsonObject.Clone as TJSONObject;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
except
|
|
|
|
|
// test should not block...never!
|
|
|
|
|
end;
|
|
|
|
|
evt.SetEvent;
|
2013-11-09 14:22:11 +01:00
|
|
|
|
end,
|
|
|
|
|
procedure(E: Exception)
|
|
|
|
|
begin
|
2013-10-30 01:09:09 +01:00
|
|
|
|
end).doPOST('/echo', ['1', '2', '3'],
|
|
|
|
|
TJSONObject.Create(TJSONPair.Create('from client', 'hello world')), true);
|
|
|
|
|
|
|
|
|
|
// wait for thred finish
|
|
|
|
|
repeat
|
|
|
|
|
r := evt.WaitFor(2000);
|
|
|
|
|
until r = TWaitResult.wrSignaled;
|
|
|
|
|
|
|
|
|
|
CheckTrue(Assigned(j));
|
|
|
|
|
CheckEquals('from server', j.Get('echo').JsonValue.Value);
|
|
|
|
|
j.Free;
|
|
|
|
|
finally
|
|
|
|
|
evt.Free;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestAsynchRequestPUT;
|
|
|
|
|
var
|
|
|
|
|
evt: TEvent;
|
2013-11-05 14:57:50 +01:00
|
|
|
|
r: TWaitResult;
|
|
|
|
|
j: TJSONObject;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
|
|
|
|
j := nil;
|
|
|
|
|
evt := TEvent.Create;
|
|
|
|
|
try
|
|
|
|
|
RESTClient.Asynch(
|
2013-11-09 14:22:11 +01:00
|
|
|
|
procedure(Response: IRESTResponse)
|
2013-10-30 01:09:09 +01:00
|
|
|
|
begin
|
|
|
|
|
try
|
2013-11-09 14:22:11 +01:00
|
|
|
|
j := Response.BodyAsJsonObject.Clone as TJSONObject;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
except
|
|
|
|
|
// test should not block...never!
|
|
|
|
|
end;
|
|
|
|
|
evt.SetEvent;
|
2013-11-09 14:22:11 +01:00
|
|
|
|
end,
|
|
|
|
|
procedure(E: Exception)
|
|
|
|
|
begin
|
2013-10-30 01:09:09 +01:00
|
|
|
|
end).doPUT('/echo', ['1', '2', '3'],
|
|
|
|
|
TJSONObject.Create(TJSONPair.Create('from client', 'hello world')), true);
|
|
|
|
|
|
|
|
|
|
// wait for thred finish
|
|
|
|
|
repeat
|
|
|
|
|
r := evt.WaitFor(2000);
|
|
|
|
|
until r = TWaitResult.wrSignaled;
|
|
|
|
|
|
|
|
|
|
CheckTrue(Assigned(j));
|
|
|
|
|
CheckEquals('from server', j.Get('echo').JsonValue.Value);
|
|
|
|
|
j.Free;
|
|
|
|
|
finally
|
|
|
|
|
evt.Free;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
2013-11-05 14:57:50 +01:00
|
|
|
|
procedure TServerTest.TestEncodingRenderJSONValue;
|
|
|
|
|
var
|
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
res := RESTClient.doGET('/encoding', []);
|
|
|
|
|
CheckEquals('j<>rn', res.BodyAsJsonObject.Get('name1').JsonValue.Value);
|
2013-11-09 14:22:11 +01:00
|
|
|
|
CheckEquals('<27>to je Unicode?', res.BodyAsJsonObject.Get('name2')
|
|
|
|
|
.JsonValue.Value);
|
2013-11-05 14:57:50 +01:00
|
|
|
|
CheckEquals('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', res.BodyAsJsonObject.Get('name3').JsonValue.Value);
|
|
|
|
|
end;
|
|
|
|
|
|
2013-12-05 16:19:01 +01:00
|
|
|
|
procedure TServerTest.TestExceptionInMVCAfterCreate;
|
|
|
|
|
var
|
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
res := RESTClient.doGET('/exception/aftercreate/nevercalled', []);
|
|
|
|
|
CheckEquals(500, res.ResponseCode);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestExceptionInMVCBeforeDestroy;
|
|
|
|
|
var
|
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
res := RESTClient.doGET('/exception/beforedestroy/nevercalled', []);
|
|
|
|
|
CheckEquals(500, res.ResponseCode);
|
|
|
|
|
end;
|
|
|
|
|
|
2014-03-24 17:37:08 +01:00
|
|
|
|
// procedure TServerTest.TestPATCHWithParamsAndJSONBody;
|
|
|
|
|
// var
|
|
|
|
|
// r: IRESTResponse;
|
|
|
|
|
// json: TJSONObject;
|
|
|
|
|
// begin
|
|
|
|
|
// json := TJSONObject.Create;
|
|
|
|
|
// json.AddPair('client', 'clientdata');
|
|
|
|
|
// r := RESTClient.doPATCH('/echo', ['1', '2', '3'], json);
|
|
|
|
|
// CheckEquals('clientdata', r.BodyAsJsonObject.Get('client').JsonValue.Value);
|
|
|
|
|
// CheckEquals('from server', r.BodyAsJsonObject.Get('echo').JsonValue.Value);
|
|
|
|
|
// end;
|
|
|
|
|
|
2013-11-18 00:44:40 +01:00
|
|
|
|
procedure TServerTest.TestPOSTWithObjectJSONBody;
|
|
|
|
|
var
|
|
|
|
|
r: IRESTResponse;
|
|
|
|
|
json: TJSONObject;
|
|
|
|
|
P: TPerson;
|
|
|
|
|
begin
|
|
|
|
|
P := TPerson.Create;
|
|
|
|
|
try
|
|
|
|
|
P.FirstName := 'Daniele';
|
|
|
|
|
P.LastName := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>';
|
|
|
|
|
P.DOB := EncodeDate(1979, 1, 1);
|
|
|
|
|
P.Married := true;
|
|
|
|
|
r := RESTClient.Accept(TMVCMimeType.APPLICATION_JSON).doPOST('/objects', [], mapper.ObjectToJSONObject(P));
|
|
|
|
|
finally
|
|
|
|
|
P.Free;
|
|
|
|
|
end;
|
|
|
|
|
P := mapper.JSONObjectToObject<TPerson>(r.BodyAsJsonObject);
|
|
|
|
|
try
|
|
|
|
|
CheckEquals('Daniele', P.FirstName);
|
|
|
|
|
CheckEquals('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', P.LastName);
|
|
|
|
|
CheckEquals(true, P.Married);
|
|
|
|
|
CheckEquals(EncodeDate(1979, 1, 1), P.DOB);
|
|
|
|
|
finally
|
|
|
|
|
P.Free;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
2013-10-30 01:09:09 +01:00
|
|
|
|
procedure TServerTest.TestPOSTWithParamsAndJSONBody;
|
|
|
|
|
var
|
2013-11-05 14:57:50 +01:00
|
|
|
|
r: IRESTResponse;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
json: TJSONObject;
|
|
|
|
|
begin
|
|
|
|
|
json := TJSONObject.Create;
|
|
|
|
|
json.AddPair('client', 'clientdata');
|
|
|
|
|
r := RESTClient.doPOST('/echo', ['1', '2', '3'], json);
|
|
|
|
|
CheckEquals('clientdata', r.BodyAsJsonObject.Get('client').JsonValue.Value);
|
|
|
|
|
CheckEquals('from server', r.BodyAsJsonObject.Get('echo').JsonValue.Value);
|
|
|
|
|
end;
|
|
|
|
|
|
2013-11-09 14:22:11 +01:00
|
|
|
|
procedure TServerTest.TestProducesConsumes01;
|
|
|
|
|
var
|
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
res := RESTClient.doPOST('/testconsumes', [],
|
|
|
|
|
TJSONString.Create('Hello World'));
|
2013-11-18 00:16:59 +01:00
|
|
|
|
CheckEquals(200, res.ResponseCode);
|
2013-11-09 14:22:11 +01:00
|
|
|
|
CheckEquals('"Hello World"', res.BodyAsJsonValue.ToString);
|
|
|
|
|
CheckEquals('application/json', res.GetContentType);
|
|
|
|
|
CheckEquals('UTF-8', res.GetContentEncoding);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestProducesConsumes02;
|
|
|
|
|
var
|
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
res := RESTClient.
|
|
|
|
|
Accept('text/plain').
|
2014-03-24 17:37:08 +01:00
|
|
|
|
ContentType('text/plain').
|
2013-11-09 14:22:11 +01:00
|
|
|
|
doPOST('/testconsumes', [], 'Hello World');
|
|
|
|
|
CheckEquals('Hello World', res.BodyAsString);
|
|
|
|
|
CheckEquals('text/plain', res.GetContentType);
|
|
|
|
|
CheckEquals('UTF-8', res.GetContentEncoding);
|
|
|
|
|
end;
|
|
|
|
|
|
2013-10-30 01:09:09 +01:00
|
|
|
|
procedure TServerTest.TestPUTWithParamsAndJSONBody;
|
|
|
|
|
var
|
2013-11-05 14:57:50 +01:00
|
|
|
|
r: IRESTResponse;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
json: TJSONObject;
|
|
|
|
|
begin
|
|
|
|
|
json := TJSONObject.Create;
|
|
|
|
|
json.AddPair('client', 'clientdata');
|
|
|
|
|
r := RESTClient.doPUT('/echo', ['1', '2', '3'], json);
|
|
|
|
|
CheckEquals('clientdata', r.BodyAsJsonObject.Get('client').JsonValue.Value);
|
|
|
|
|
CheckEquals('from server', r.BodyAsJsonObject.Get('echo').JsonValue.Value);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestReqWithParams;
|
|
|
|
|
var
|
|
|
|
|
r: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
r := RESTClient.doGET('/unknownurl/bla/bla', []);
|
|
|
|
|
CheckEquals(404, r.ResponseCode, '/unknownurl/bla/bla');
|
|
|
|
|
|
|
|
|
|
r := RESTClient.doGET('/req/with/params/', []);
|
|
|
|
|
CheckEquals(404, r.ResponseCode, '/req/with/params/');
|
|
|
|
|
|
|
|
|
|
r := RESTClient.doGET('/req/with/params', []);
|
|
|
|
|
CheckEquals(404, r.ResponseCode, '/req/with/params');
|
|
|
|
|
|
|
|
|
|
r := RESTClient.doGET('/req/with/params', ['1', '2', '3']);
|
|
|
|
|
CheckEquals(200, r.ResponseCode);
|
|
|
|
|
CheckEquals('1', r.BodyAsJsonObject.Get('par1').JsonValue.Value);
|
|
|
|
|
CheckEquals('2', r.BodyAsJsonObject.Get('par2').JsonValue.Value);
|
|
|
|
|
CheckEquals('3', r.BodyAsJsonObject.Get('par3').JsonValue.Value);
|
|
|
|
|
CheckEquals('GET', r.BodyAsJsonObject.Get('method').JsonValue.Value);
|
|
|
|
|
|
|
|
|
|
r := RESTClient.doPOST('/req/with/params', ['1', '2', '3']);
|
|
|
|
|
CheckEquals(404, r.ResponseCode);
|
|
|
|
|
|
|
|
|
|
r := RESTClient.doPUT('/req/with/params', ['1', '2', '3']);
|
|
|
|
|
CheckEquals(404, r.ResponseCode);
|
|
|
|
|
|
|
|
|
|
r := RESTClient.doDELETE('/req/with/params', ['1', '2', '3']);
|
|
|
|
|
CheckEquals(200, r.ResponseCode);
|
|
|
|
|
CheckNull(r.BodyAsJsonObject);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServerTest.TestSession;
|
|
|
|
|
var
|
2013-11-05 14:57:50 +01:00
|
|
|
|
c1: TRESTClient;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
2014-02-24 10:20:34 +01:00
|
|
|
|
c1 := TRESTClient.Create('localhost', 9999);
|
2013-10-30 01:09:09 +01:00
|
|
|
|
try
|
|
|
|
|
c1.Accept(TMVCMimeType.APPLICATION_JSON);
|
|
|
|
|
c1.doPOST('/session', ['daniele teti']); // imposto un valore in sessione
|
|
|
|
|
res := c1.doGET('/session', []); // rileggo il valore dalla sessione
|
|
|
|
|
CheckEquals('"daniele teti"', res.BodyAsString);
|
|
|
|
|
c1.Accept(TMVCMimeType.TEXT_PLAIN);
|
|
|
|
|
res := c1.doGET('/session', []);
|
|
|
|
|
// rileggo il valore dalla sessione
|
|
|
|
|
CheckEquals('daniele teti', res.BodyAsString);
|
|
|
|
|
|
|
|
|
|
// aggiungo altri cookies
|
|
|
|
|
res := c1.doGET('/lotofcookies', []); // rileggo il valore dalla sessione
|
|
|
|
|
CheckEquals(200, res.ResponseCode);
|
|
|
|
|
c1.Accept(TMVCMimeType.TEXT_PLAIN);
|
|
|
|
|
res := c1.doGET('/session', []); // rileggo il valore dalla sessione
|
|
|
|
|
CheckEquals('daniele teti', res.BodyAsString);
|
|
|
|
|
finally
|
|
|
|
|
c1.Free;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
2013-11-09 14:22:11 +01:00
|
|
|
|
procedure TBaseServerTest.DoLoginWith(UserName: string);
|
2013-10-30 01:09:09 +01:00
|
|
|
|
var
|
2013-11-18 00:44:40 +01:00
|
|
|
|
P: TJSONObject;
|
2013-10-30 01:09:09 +01:00
|
|
|
|
res: IRESTResponse;
|
|
|
|
|
begin
|
|
|
|
|
res := RESTClient.doGET('/login', [UserName]);
|
|
|
|
|
CheckTrue(res.ResponseCode = 200, 'Login Failed');
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
initialization
|
|
|
|
|
|
|
|
|
|
RegisterTest(TServerTest.Suite);
|
|
|
|
|
|
|
|
|
|
end.
|