Skip to content

Commit

Permalink
feat: node tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mvarendorff committed Nov 4, 2023
1 parent 0ff8df5 commit 17b7006
Show file tree
Hide file tree
Showing 7 changed files with 250 additions and 1 deletion.
25 changes: 25 additions & 0 deletions src/SDK/Language/Node.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,21 +61,41 @@ public function getFiles(): array
'destination' => 'lib/permission.js',
'template' => 'node/lib/permission.js.twig',
],
[
'scope' => 'default',
'destination' => 'test/permission.test.js',
'template' => 'node/test/permission.test.js.twig',
],
[
'scope' => 'default',
'destination' => 'lib/role.js',
'template' => 'node/lib/role.js.twig',
],
[
'scope' => 'default',
'destination' => 'test/role.test.js',
'template' => 'node/test/role.test.js.twig',
],
[
'scope' => 'default',
'destination' => 'lib/id.js',
'template' => 'node/lib/id.js.twig',
],
[
'scope' => 'default',
'destination' => 'test/id.test.js',
'template' => 'node/test/id.test.js.twig',
],
[
'scope' => 'default',
'destination' => 'lib/query.js',
'template' => 'node/lib/query.js.twig',
],
[
'scope' => 'default',
'destination' => 'test/query.test.js',
'template' => 'node/test/query.test.js.twig',
],
[
'scope' => 'default',
'destination' => 'lib/inputFile.js',
Expand All @@ -91,6 +111,11 @@ public function getFiles(): array
'destination' => '/lib/services/{{service.name | caseDash}}.js',
'template' => 'node/lib/services/service.js.twig',
],
[
'scope' => 'service',
'destination' => '/test/services/{{service.name | caseDash}}.test.js',
'template' => 'node/test/services/service.test.js.twig',
],
[
'scope' => 'default',
'destination' => 'README.md',
Expand Down
3 changes: 2 additions & 1 deletion templates/node/package.json.twig
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"url": "{{ sdk.gitURL }}"
},
"devDependencies": {
"@types/node": "^18.16.1"
"@types/node": "^18.16.1",
"jest": "^29.7.0"
},
"dependencies": {
"axios": "^1.4.0",
Expand Down
6 changes: 6 additions & 0 deletions templates/node/test/id.test.js.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const ID = require("../lib/id");

describe("ID", () => {
test('unique', () => expect(ID.unique()).toEqual('unique()'));
test('custom', () => expect(ID.custom('custom')).toEqual('custom'));
});
10 changes: 10 additions & 0 deletions templates/node/test/permission.test.js.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const Permission = require("../lib/permission");
const Role = require("../lib/role");

describe('Permission', () => {
test('read', () => expect(Permission.read(Role.any())).toEqual('read("any")'));
test('write', () => expect(Permission.write(Role.any())).toEqual('write("any")'));
test('create', () => expect(Permission.create(Role.any())).toEqual('create("any")'));
test('update', () => expect(Permission.update(Role.any())).toEqual('update("any")'));
test('delete', () => expect(Permission.delete(Role.any())).toEqual('delete("any")'));
})
155 changes: 155 additions & 0 deletions templates/node/test/query.test.js.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
const Query = require("../lib/query");

const tests = [
{
description: 'with a string',
value: 's',
expectedValues: '["s"]'
},
{
description: 'with a integer',
value: 1,
expectedValues: '[1]'
},
{
description: 'with a double',
value: 1.2,
expectedValues: '[1.2]'
},
{
description: 'with a whole number double',
value: 1.0,
expectedValues: '[1]'
},
{
description: 'with a bool',
value: false,
expectedValues: '[false]'
},
{
description: 'with a list',
value: ['a', 'b', 'c'],
expectedValues: '["a","b","c"]'
}
];

describe('Query', () => {
describe('basic filter equal', () => {
for (const t of tests) {
test(t.description, () =>
expect(Query.equal("attr", t.value))
.toEqual(`equal("attr", ${t.expectedValues})`)
)
}
})

describe('basic filter notEqual', () => {
for (const t of tests) {
test(t.description, () =>
expect(Query.notEqual("attr", t.value))
.toEqual(`notEqual("attr", ${t.expectedValues})`)
)
}
});

describe('basic filter lessThan', () => {
for (const t of tests) {
test(t.description, () =>
expect(Query.lessThan("attr", t.value))
.toEqual(`lessThan("attr", ${t.expectedValues})`)
)
}
});

describe('basic filter lessThanEqual', () => {
for (const t of tests) {
test(t.description, () =>
expect(Query.lessThanEqual("attr", t.value))
.toEqual(`lessThanEqual("attr", ${t.expectedValues})`)
)
}
});

describe('basic filter greaterThan', () => {
for (const t of tests) {
test(t.description, () =>
expect(Query.greaterThan("attr", t.value))
.toEqual(`greaterThan("attr", ${t.expectedValues})`)
)
}
});

describe('basic filter greaterThanEqual', () => {
for (const t of tests) {
test(t.description, () =>
expect(Query.greaterThanEqual("attr", t.value))
.toEqual(`greaterThanEqual("attr", ${t.expectedValues})`)
)
}
});

test('search', () =>
expect(Query.search('attr', 'keyword1 keyword2'))
.toEqual('search("attr", ["keyword1 keyword2"])')
);

test('isNull', () =>
expect(Query.isNull('attr'))
.toEqual('isNull("attr")')
);

test('isNotNull', () =>
expect(Query.isNotNull('attr'))
.toEqual('isNotNull("attr")')
);

describe('between', () => {
test('with integers', () =>
expect(Query.between('attr', 1, 2))
.toEqual('between("attr", [1,2])')
);
test('with doubles', () =>
expect(Query.between('attr', 1.2, 2.2))
.toEqual('between("attr", [1.2,2.2])')
);
test('with strings', () =>
expect(Query.between('attr', "a", "z"))
.toEqual('between("attr", ["a","z"])')
);
});

test('select', () =>
expect(Query.select(['attr1', 'attr2']))
.toEqual('select(["attr1","attr2"])')
);

test('orderAsc', () =>
expect(Query.orderAsc('attr'))
.toEqual('orderAsc("attr")')
);

test('orderDesc', () =>
expect(Query.orderDesc('attr'))
.toEqual('orderDesc("attr")')
);

test('cursorBefore', () =>
expect(Query.cursorBefore('attr'))
.toEqual('cursorBefore("attr")')
);

test('cursorAfter', () =>
expect(Query.cursorAfter('attr'))
.toEqual('cursorAfter("attr")')
);

test('limit', () =>
expect(Query.limit(1))
.toEqual('limit(1)')
);

test('offset', () =>
expect(Query.offset(1))
.toEqual('offset(1)')
);
})
14 changes: 14 additions & 0 deletions templates/node/test/role.test.js.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const Role = require("../lib/role");

describe('Role', () => {
test('any', () => expect(Role.any()).toEqual('any'));
test('user without status', () => expect(Role.user('custom')).toEqual('user:custom'));
test('user with status', () => expect(Role.user('custom', 'verified')).toEqual('user:custom/verified'));
test('users without status', () => expect(Role.users()).toEqual('users'));
test('users with status', () => expect(Role.users('verified')).toEqual('users/verified'));
test('guests', () => expect(Role.guests()).toEqual('guests'));
test('team without role', () => expect(Role.team('custom')).toEqual('team:custom'))
test('team with role', () => expect(Role.team('custom', 'owner')).toEqual('team:custom/owner'))
test('member', () => expect(Role.member('custom')).toEqual('member:custom'))
test('label', () => expect(Role.label('admin')).toEqual('label:admin'))
})
38 changes: 38 additions & 0 deletions templates/node/test/services/service.test.js.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const Client = require("../../lib/client");
const InputFile = require("../../lib/inputFile");
const {{ service.name | caseUcfirst }} = require("../../lib/services/{{ service.name | caseCamel }}");

const mockedAxios = require("axios");
jest.mock('axios', () => jest.fn());

describe('{{ service.name | caseUcfirst }}', () => {
const client = new Client();
const {{ service.name | caseCamel }} = new {{ service.name | caseUcfirst }}(client);

{% for method in service.methods ~%}
test('test method {{ method.name | caseCamel }}()', async () => {
{%~ if method.type == 'webAuth' %}
const data = '';
{%~ elseif method.type == 'location' %}
const data = new Uint8Array(0);
{%~ else %}
{%- if method.responseModel and method.responseModel != 'any' %}
const data = {
{%- for definition in spec.definitions ~%}{%~ if definition.name == method.responseModel -%}{%~ for property in definition.properties | filter((param) => param.required) ~%}
'{{ property.name | escapeDollarSign }}': {% if property.type == 'object' %}{}{% elseif property.type == 'array' %}[]{% elseif property.type == 'string' %}'{{ property.example | escapeDollarSign }}'{% elseif property.type == 'boolean' %}true{% else %}{{ property.example }}{% endif %},{%~ endfor ~%}{% set break = true %}{%- else -%}{% set continue = true %}{%- endif -%}{%~ endfor -%}
};
{%~ else %}
const data = '';
{%~ endif %}
{%~ endif %}

mockedAxios.mockImplementation(() => Promise.resolve({data: data}));

const response = await {{ service.name | caseCamel }}.{{ method.name | caseCamel }}({%~ for parameter in method.parameters.all | filter((param) => param.required) ~%}
{% if parameter.type == 'object' %}{}{% elseif parameter.type == 'array' %}[]{% elseif parameter.type == 'file' %}InputFile.fromBuffer(new Uint8Array(0), 'image.png'){% elseif parameter.type == 'boolean' %}true{% elseif parameter.type == 'string' %}'{% if parameter.example is not empty %}{{ parameter.example | escapeDollarSign }}{% endif %}'{% elseif parameter.type == 'integer' and parameter['x-example'] is empty %}1{% elseif parameter.type == 'number' and parameter['x-example'] is empty %}1.0{% else %}{{ parameter.example }}{%~ endif ~%},{%~ endfor ~%}
);

expect(response).toEqual(data);
});
{% endfor %}
})

0 comments on commit 17b7006

Please sign in to comment.