fix: all tests, wrap up work

This commit is contained in:
Julian Lam
2020-12-18 11:23:16 -05:00
parent 9c2de86a6e
commit f416dc177a
6 changed files with 72 additions and 8 deletions

View File

@@ -54,6 +54,8 @@ tags:
description: Disparate method of categorizing topics
- name: shorthand
description: Convenience and utility routes for accessing other part of the API
- name: other
description: Other one-off routes that do not fit in a section of their own
paths:
/api/:
$ref: 'read/index.yaml'
@@ -177,6 +179,8 @@ paths:
$ref: 'read/categories.yaml'
"/api/categories/{cid}/moderators":
$ref: 'read/categories/cid/moderators.yaml'
"/api/topic/{topic_id}/{slug}":
$ref: 'read/topic/topic_id.yaml'
"/api/topic/{topic_id}/{slug}/{post_index}":
$ref: 'read/topic/topic_id.yaml'
/api/recent:
@@ -203,6 +207,8 @@ paths:
$ref: 'read/register/complete.yaml'
"/api/confirm/{code}":
$ref: 'read/confirm/code.yaml'
/api/tos:
$ref: 'read/tos.yaml'
/api/search:
$ref: 'read/search.yaml'
"/api/reset":
@@ -231,6 +237,8 @@ paths:
$ref: 'read/popular.yaml'
/api/top:
$ref: 'read/top.yaml'
"/api/category/{category_id}/{slug}":
$ref: 'read/category/category_id.yaml'
"/api/category/{category_id}/{slug}/{topic_index}":
$ref: 'read/category/category_id.yaml'
/api/self:
@@ -301,3 +309,5 @@ paths:
$ref: 'read/groups/slug.yaml'
"/api/groups/{slug}/members":
$ref: 'read/groups/slug/members.yaml'
/api/outgoing:
$ref: 'read/outgoing.yaml'

View File

@@ -9,6 +9,12 @@ get:
type: string
required: true
example: /admin/manage/groups
- in: path
name: groupname
schema:
type: string
required: true
example: registered-users
responses:
"200":
description: "A CSV file containing all users in the group"

View File

@@ -18,5 +18,4 @@ get:
description: Translation key for client-side localisation
required:
- title
- $ref: ../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs
- $ref: ../../components/schemas/CommonProps.yaml#/CommonProps

View File

@@ -0,0 +1,29 @@
get:
tags:
- other
summary: Warn before navigating externally
parameters:
- in: query
name: url
schema:
type: string
description: URL of the page to warn the user about
example: https://example.org
description: This route presents a warning to a user notifying them that the page they are about to view is hosted externally. They then have the option of continuing onwards or going back to where they came from.
responses:
"200":
description: Warning page presented
content:
application/json:
schema:
allOf:
- type: object
properties:
outgoing:
type: string
description: Escaped URL of the page to navigate to
title:
description: The page title
type: string
- $ref: ../components/schemas/Breadcrumbs.yaml#/Breadcrumbs
- $ref: ../components/schemas/CommonProps.yaml#/CommonProps

View File

@@ -0,0 +1,18 @@
get:
tags:
- authentication
summary: Get forum terms of service
description: This route allows you to view the forum terms of service.
responses:
"200":
description: Terms of service retrieved.
content:
application/json:
schema:
allOf:
- type: object
properties:
termsOfUse:
type: string
description: Full text of the configured terms of service/terms of use.
- $ref: ../components/schemas/CommonProps.yaml#/CommonProps

View File

@@ -100,6 +100,7 @@ describe('API', async () => {
}],
});
meta.config.allowTopicsThumbnail = 1;
meta.config.termsOfUse = 'I, for one, welcome our new test-drive overlords';
// Create a category
const testCategory = await categories.create({ name: 'test' });
@@ -225,8 +226,8 @@ describe('API', async () => {
});
});
// generateTests(readApi, Object.keys(readApi.paths));
// generateTests(writeApi, Object.keys(writeApi.paths), writeApi.servers[0].url);
generateTests(readApi, Object.keys(readApi.paths));
generateTests(writeApi, Object.keys(writeApi.paths), writeApi.servers[0].url);
function generateTests(api, paths, prefix) {
// Iterate through all documented paths, make a call to it, and compare the result body with what is defined in the spec
@@ -252,8 +253,9 @@ describe('API', async () => {
return;
}
const names = (path.match(/{[\w\-_*]+}?/g) || []).map(match => match.slice(1, -1));
assert(context[method].parameters.map(param => (param.in === 'path' ? param.name : null)).filter(Boolean).every(name => names.includes(name)), `${method.toUpperCase()} ${path} has parameter(s) in path that are not defined in schema`);
const pathParams = (path.match(/{[\w\-_*]+}?/g) || []).map(match => match.slice(1, -1));
const schemaParams = context[method].parameters.map(param => (param.in === 'path' ? param.name : null)).filter(Boolean);
assert(pathParams.every(param => schemaParams.includes(param)), `${method.toUpperCase()} ${path} has path parameters specified but not defined`);
});
it('should have examples when parameters are present', () => {
@@ -333,11 +335,11 @@ describe('API', async () => {
});
} else if (type === 'form') {
response = await new Promise((resolve, reject) => {
helpers.uploadFile(url, pathLib.join(__dirname, './files/test.png'), {}, jar, csrfToken, function (err, res, body) {
helpers.uploadFile(url, pathLib.join(__dirname, './files/test.png'), {}, jar, csrfToken, function (err, res) {
if (err) {
return reject(err);
}
resolve(body);
resolve(res);
});
});
}