diff --git a/.gitignore b/.gitignore index b6a96d1c..52bba02c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ jspm_packages/ mochawesome-report/ coverage/ test/utility/dataFiles/ +test/sanity-check/utility/dataFiles/ report.json # TypeScript v1 declaration files diff --git a/package.json b/package.json index af403433..d4add9d5 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "buildnativescript": "webpack --config webpack/webpack.nativescript.js --mode production", "buildweb": "webpack --config webpack/webpack.web.js --mode production", "test": "npm run test:api && npm run test:unit", + "test:sanity": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/sanity-check/sanity.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:api": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/test.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:unit": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/unit/index.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:unit:report:json": "BABEL_ENV=test nyc --reporter=clover --reporter=text mocha --require @babel/register ./test/unit/index.js -t 30000 --reporter json --reporter-options output=report.json --require babel-polyfill", diff --git a/test/sanity-check/api/contentType-delete-test.js b/test/sanity-check/api/contentType-delete-test.js new file mode 100644 index 00000000..e50722c5 --- /dev/null +++ b/test/sanity-check/api/contentType-delete-test.js @@ -0,0 +1,28 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { multiPageCT, singlepageCT } from '../mock/content-type' +import { contentstackClient } from '../utility/ContentstackClient' + +var client = {} + +describe('Content Type delete api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Content Type delete', done => { + makeContentType(multiPageCT.content_type.uid) + .delete().then((data) => { + expect(data.notice).to.be.equal('Content Type deleted successfully.') + done() + }) + makeContentType(singlepageCT.content_type.uid).delete() + .catch(done) + }) +}) + +function makeContentType (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).contentType(uid) +} diff --git a/test/sanity-check/api/contentType-test.js b/test/sanity-check/api/contentType-test.js new file mode 100644 index 00000000..49b09e7f --- /dev/null +++ b/test/sanity-check/api/contentType-test.js @@ -0,0 +1,123 @@ +import path from 'path' +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite.js' +import { singlepageCT, multiPageCT, schema } from '../mock/content-type.js' +import { contentstackClient } from '../utility/ContentstackClient.js' + +let client = {} +let multiPageCTUid = '' +let importCTUid = '' + +describe('Content Type api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Create Single page ContentType Schema', done => { + makeContentType() + .create(singlepageCT) + .then((contentType) => { + expect(contentType.uid).to.be.equal(singlepageCT.content_type.uid) + expect(contentType.title).to.be.equal(singlepageCT.content_type.title) + done() + }) + .catch(done) + }) + + it('Create Multi page ContentType Schema', done => { + makeContentType() + .create(multiPageCT) + .then((contentType) => { + multiPageCTUid = contentType.uid + expect(contentType.uid).to.be.equal(multiPageCT.content_type.uid) + expect(contentType.title).to.be.equal(multiPageCT.content_type.title) + done() + }) + .catch(done) + }) + + it('Get all ContentType', done => { + makeContentType() + .query() + .find() + .then((response) => { + response.items.forEach(contentType => { + expect(contentType.uid).to.be.not.equal(null) + expect(contentType.title).to.be.not.equal(null) + expect(contentType.schema).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + + it('Query ContentType title', done => { + makeContentType() + .query({ query: { title: singlepageCT.content_type.title } }) + .find() + .then((response) => { + response.items.forEach(contentType => { + expect(contentType.uid).to.be.not.equal(null) + expect(contentType.title).to.be.not.equal(null) + expect(contentType.schema).to.be.not.equal(null) + expect(contentType.uid).to.be.equal(singlepageCT.content_type.uid, 'UID not mathcing') + expect(contentType.title).to.be.equal(singlepageCT.content_type.title, 'Title not mathcing') + }) + done() + }) + .catch(done) + }) + + it('Fetch ContentType from uid', done => { + makeContentType(multiPageCT.content_type.uid) + .fetch() + .then((contentType) => { + expect(contentType.uid).to.be.equal(multiPageCT.content_type.uid) + expect(contentType.title).to.be.equal(multiPageCT.content_type.title) + done() + }) + .catch(done) + }) + + it('Fetch and Update ContentType schema', done => { + makeContentType(multiPageCTUid) + .fetch() + .then((contentType) => { + contentType.schema = schema + return contentType.update() + }) + .then((contentType) => { + expect(contentType.schema.length).to.be.equal(6) + done() + }) + .catch(done) + }) + + it('Import content type', done => { + makeContentType().import({ + content_type: path.join(__dirname, '../mock/contentType.json') + }) + .then((response) => { + importCTUid = response.uid + expect(response.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Delete ContentTypes', done => { + makeContentType(importCTUid) + .delete() + .then((contentType) => { + expect(contentType.notice).to.be.equal('Content Type deleted successfully.') + done() + }) + .catch(done) + }) +}) + +function makeContentType (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).contentType(uid) +} diff --git a/test/sanity-check/api/user-test.js b/test/sanity-check/api/user-test.js new file mode 100644 index 00000000..d47bdf73 --- /dev/null +++ b/test/sanity-check/api/user-test.js @@ -0,0 +1,77 @@ +import { expect } from 'chai' +import { describe, it } from 'mocha' +import { contentstackClient } from '../../utility/ContentstackClient' +import { jsonWrite } from '../../utility/fileOperations/readwrite' +import axios from 'axios' +import dotenv from 'dotenv' + +dotenv.config() +var authtoken = '' +var loggedinUserID = '' +var client = contentstackClient() +describe('Contentstack User Session api Test', () => { + it('User login wrong credentials', done => { + contentstackClient().login({ email: process.env.EMAIL, password: process.env.PASSWORD }) + .then((response) => { + done() + }).catch((error) => { + const jsonMessage = JSON.parse(error.message) + const payload = JSON.parse(jsonMessage.request.data) + expect(jsonMessage.status).to.be.equal(422, 'Status code does not match') + expect(jsonMessage.errorMessage).to.not.equal(null, 'Error message not proper') + expect(jsonMessage.errorCode).to.be.equal(104, 'Error code does not match') + expect(payload.user.email).to.be.equal(process.env.EMAIL, 'Email id does not match') + expect(payload.user.password).to.be.equal('contentstack', 'Password does not match') + done() + }) + }) + + it('User Login test', done => { + client.login({ email: process.env.EMAIL, password: process.env.PASSWORD }, { include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((response) => { + jsonWrite(response.user, 'loggedinuser.json') + expect(response.notice).to.be.equal('Login Successful.', 'Login success messsage does not match.') + done() + }) + .catch(done) + }) + + it('User logout test', done => { + client.logout() + .then((response) => { + expect(axios.defaults.headers.common.authtoken).to.be.equal(undefined) + expect(response.notice).to.be.equal('You\'ve logged out successfully.') + done() + }) + .catch(done) + }) + + it('User login with credentials', done => { + client.login({ email: process.env.EMAIL, password: process.env.PASSWORD }, { include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((response) => { + loggedinUserID = response.user.uid + jsonWrite(response.user, 'loggedinuser.json') + expect(response.notice).to.be.equal('Login Successful.', 'Login success messsage does not match.') + done() + }) + .catch(done) + }) + + it('Get Current user info test', done => { + client.getUser().then((user) => { + authtoken = user.authtoken + expect(user.uid).to.be.equal(loggedinUserID) + done() + }) + .catch(done) + }) + + it('Get user info from authtoken', done => { + contentstackClient(authtoken) + .getUser() + .then((user) => { + expect(user.uid).to.be.equal(loggedinUserID) + expect(true).to.be.equal(true) + done() + }) + .catch(done) + }) +}) diff --git a/test/sanity-check/mock/content-type.js b/test/sanity-check/mock/content-type.js new file mode 100644 index 00000000..2e4a7713 --- /dev/null +++ b/test/sanity-check/mock/content-type.js @@ -0,0 +1,179 @@ +const singlepageCT = { + content_type: + { + options: + { + is_page: true, + singleton: true, + title: 'title', + sub_title: [] + }, + title: 'Single Page', + uid: 'single_page', + schema: [ + { + display_name: 'Title', + uid: 'title', + data_type: 'text', + mandatory: true, + unique: true, + field_metadata: + { + _default: true + } + }, + { + display_name: 'URL', + uid: 'url', + data_type: 'text', + mandatory: true, + field_metadata: { + _default: true, + instruction: '' + } + } + ] + }, + prevcreate: true +} + +const multiPageCT = { + content_type: + { + options: + { + is_page: true, + singleton: false, + title: 'title', + sub_title: [], + url_pattern: '/:title' + }, + title: 'Multi page', + uid: 'multi_page', + schema: + [ + { + display_name: 'Title', + uid: 'title', + data_type: 'text', + mandatory: true, + unique: true, + field_metadata: + { + _default: true + } + }, + { + display_name: 'URL', + uid: 'url', + data_type: 'text', + mandatory: false, + field_metadata: + { + _default: true + } + } + ] + }, + prevcreate: true +} + +const schema = [ + { + display_name: 'Title', + uid: 'title', + data_type: 'text', + mandatory: true, + unique: true, + field_metadata: + { + _default: true, + version: 3 + }, + non_localizable: false, + multiple: false, + fldUid: 'title' + }, + { + display_name: 'URL', + uid: 'url', + data_type: 'text', + mandatory: true, + field_metadata: + { + _default: true, + version: 3 + }, + non_localizable: false, + multiple: false, + unique: false, + fldUid: 'url' + }, + { + data_type: 'text', + display_name: 'Single line textbox', + abstract: 'Name, title, email address, any short text', + uid: 'single_line', + field_metadata: + { + description: '', + default_value: '' + }, + class: 'high-lighter', + format: '', + error_messages: { format: '' }, + fldUid: 'single_line' + }, + { + data_type: 'text', + display_name: 'Multi line textbox', + abstract: 'Descriptions, paragraphs, long text', + uid: 'multi_line', + field_metadata: + { + description: '', + default_value: '', + multiline: true + }, + class: 'high-lighter', + format: '', + error_messages: + { + format: '' + }, + fldUid: 'multi_line' + }, + { + data_type: 'text', + display_name: 'Markdown', + abstract: 'Input text in markdown language', + uid: 'markdown', + field_metadata: + { + description: '', + markdown: true + }, + class: 'high-lighter', + fldUid: 'markdown' + }, + { + data_type: 'blocks', + display_name: 'Modular Blocks', + abstract: 'Create content dynamically', + blocks: + [ + { + title: 'Block1', + uid: 'block1', + blockType: 'custom', + autoEdit: true, + schema: + [ + { data_type: 'file', display_name: 'File', abstract: 'Upload images, videos, docs, etc.', uid: 'file', icon_class: 'icon-file-text-alt', class: 'high-lighter', size: { min: '', max: '' }, extensions: '', field_metadata: { description: '', rich_text_type: 'standard' }, fldUid: 'modular_blocks > block1 > file' }, { data_type: 'link', display_name: 'Link', abstract: 'Add links to text', uid: 'link', icon_class: 'icon-link', class: 'high-lighter', field_metadata: { description: '', default_value: { title: '', url: '' } }, fldUid: 'modular_blocks > block1 > link' }] }], + multiple: true, + uid: 'modular_blocks', + field_metadata: {}, + class: 'high-lighter', + fldUid: 'modular_blocks' }] + +export { singlepageCT, multiPageCT, schema } diff --git a/test/sanity-check/mock/contentType.json b/test/sanity-check/mock/contentType.json new file mode 100644 index 00000000..df456dd6 --- /dev/null +++ b/test/sanity-check/mock/contentType.json @@ -0,0 +1,36 @@ +{ + "options": + { + "is_page": true, + "singleton": false, + "title": "title", + "sub_title": [], + "url_pattern": "/:title" + }, + "title": "Multi page from JSON", + "uid": "multi_page_from_json", + "schema": + [ + { + "display_name": "Title", + "uid": "title", + "data_type": "text", + "mandatory": true, + "unique": true, + "field_metadata": + { + "_default": true + } + }, + { + "display_name": "URL", + "uid": "url", + "data_type": "text", + "mandatory": false, + "field_metadata": + { + "_default": true + } + } + ] + } \ No newline at end of file diff --git a/test/sanity-check/sanity.js b/test/sanity-check/sanity.js new file mode 100644 index 00000000..8faf2378 --- /dev/null +++ b/test/sanity-check/sanity.js @@ -0,0 +1,3 @@ +require('./api/user-test') +require('./api/contentType-test') +require('./api/contentType-delete-test') diff --git a/test/sanity-check/utility/ContentstackClient.js b/test/sanity-check/utility/ContentstackClient.js new file mode 100644 index 00000000..a91c1171 --- /dev/null +++ b/test/sanity-check/utility/ContentstackClient.js @@ -0,0 +1,12 @@ +import * as contentstack from '../../../lib/contentstack.js' +import dotenv from 'dotenv' +dotenv.config() +function contentstackClient (authtoken = null) { + var params = { host: process.env.HOST, defaultHostName: process.env.DEFAULTHOST } + if (authtoken) { + params.authtoken = authtoken + } + return contentstack.client(params) +} + +export { contentstackClient } diff --git a/test/sanity-check/utility/fileOperations/readwrite.js b/test/sanity-check/utility/fileOperations/readwrite.js new file mode 100644 index 00000000..c06fe895 --- /dev/null +++ b/test/sanity-check/utility/fileOperations/readwrite.js @@ -0,0 +1,35 @@ +import fs from 'fs' +import path from 'path' +const dataFiles = './test/utility/dataFiles/' +export function jsonReader (fileName) { + if (!fs.existsSync(`${dataFiles}${fileName}`)) { + return + } + const fileContents = fs.readFileSync(`${dataFiles}${fileName}`, 'utf8') + try { + const object = JSON.parse(fileContents) + return object + } catch (err) { + return err + } +} + +export function jsonWrite (json, fileName) { + const jsonString = JSON.stringify(json) + ensureDirectoryExistence(`${dataFiles}${fileName}`) + fs.writeFileSync(`${dataFiles}${fileName}`, jsonString) +} + +function ensureDirectoryExistence (filePath) { + var dirname = path.dirname(filePath) + if (!fs.existsSync(dirname)) { + ensureDirectoryExistence(dirname) + fs.mkdirSync(dirname) + } +} + +export function writeDownloadedFile (response, fileName) { + const filePath = path.resolve(dataFiles, fileName) + ensureDirectoryExistence(`${dataFiles}${fileName}`) + response.data.pipe(fs.createWriteStream(filePath)) +}