@klient/testing
v1.1.0
Published
Toolbox for testing Klient library
Downloads
2
Readme
Klient testing
Introduction
This repository purposes tools for testing Klient library with JEST to make test files more readable.
Requirements
Installation
Install testing package with your favorite package manager :
# With NPM
$ npm install --save-dev @klient/testing
# With YARN
$ yarn add --dev @klient/testing
MockAxiosWithRestApi
Mock Axios with a fake Rest API described below.
import axios from 'axios';
import { mockAxiosWithRestApi } from '@klient/testing';
//
// Mock Axios
//
jest.mock('axios');
const api = mockAxiosWithRestApi({
// Optionally load Post resources data in API
// posts: [
// {
// id: 'xxx',
// title: 'Title',
// content: 'Content',
// author: 'test'
// }
// ]
});
//
// Start a test
//
test('example', async () => {
let credentials = {};
let postId = null;
//
// Get JWT token for protected routes
//
await axios
.post('/auth', {
username: 'test',
password: 'test',
// exp: '2h', // Specify token duration
// refreshExp: '3h' // Specify refresh token duration
})
.then(response => {
console.log(response.data);
// {
// "token": "...",
// "refresh_token": "..."
// }
credentials = response.data
})
;
//
// Refresh JWT token with refresh token provided
//
await axios
.post('/auth/refresh', { refresh_token: credentials.refresh_token })
.then(response => {
console.log(response.data);
// {
// "token": "...",
// "refresh_token": "..."
// }
credentials = response.data
})
;
//
// Create a Post resource
//
// YOU MUST BE AUTHENTICATED WITH JWT TOKEN
//
await axios
.post('/posts', { title: 'test', content: 'test' }, {
headers: {
Authorization: `Bearer ${credentials.token}`
}
})
.then(response => {
console.log(response.data);
// {
// "id": "2190428f-6785-41be-a4c6-e6ad7cd978de",
// "title": "test",
// "content": "test",
// "author": "test"
// }
postId = response.data.id;
})
;
//
// Get Post resource collection
//
await axios
.get('/posts')
.then(response => {
console.log(response.data);
// [
// {
// "id": "2190428f-6785-41be-a4c6-e6ad7cd978de",
// "title": "test",
// "content": "test",
// "author": "test"
// }
// ]
})
;
//
// Get Post resource item
//
await axios
.get(`/posts/${postId}`)
.then(response => {
console.log(response.data);
// {
// "id": "2190428f-6785-41be-a4c6-e6ad7cd978de",
// "title": "test",
// "content": "test",
// "author": "test"
// }
})
;
//
// Update Post resource item
//
// YOU MUST BE AUTHENTICATED WITH JWT TOKEN FETCHED WITH THE SAME USERNAME AS POST AUTHOR
//
await axios
.put(`/posts/${postId}`, { title: 'Test', content: 'Test' } {
headers: {
Authorization: `Bearer ${credentials.token}`
}
})
.then(response => {
console.log(response.data);
// {
// "id": "2190428f-6785-41be-a4c6-e6ad7cd978de",
// "title": "Test",
// "content": "Test",
// "author": "test"
// }
})
;
//
// Delete Post resource item
//
// YOU MUST BE AUTHENTICATED WITH JWT TOKEN FETCHED WITH THE SAME USERNAME AS POST AUTHOR
//
await axios
.delete(`/posts/${postId}`, {
headers: {
Authorization: `Bearer ${credentials.token}`
}
})
;
//
// Not found
//
await axios
.get('/unkown')
.catch(e => {
// Print 404
console.log(e.response.status);
})
;
//
// Reset API data
//
api.reset();
await axios
.get('/posts')
.then(response => {
console.log(e.response.data); // Print []
})
;
});
Notes
- The API will reject requests containing invalid token with 401 status code
- The entrypoints whoses expect request body will return a 400 status code if invalid data are provided