diff --git a/jest.js.config.js b/jest.js.config.js new file mode 100644 index 00000000..26212a05 --- /dev/null +++ b/jest.js.config.js @@ -0,0 +1,21 @@ +module.exports = { + testEnvironment: "node", + testMatch: ["**/test/**/*.js"], + testPathIgnorePatterns: [ + "/node_modules/", + "/test/index.js", + "/test/config.js", + "/test/sync_config.js", + "/test/.*/utils.js", + "/test/sync/", + ], + reporters: ["default", ["jest-html-reporters", + { + "filename": "tap-html.html", + "expand": true, + "inlineSource": true, + "includeFailureMsg": true, // Includes error messages in JSON + "includeConsoleLog": true + } + ]], +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c0de69ab..43626622 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,10 @@ "version": "3.25.0", "license": "MIT", "dependencies": { - "@contentstack/utils": "^1.3.15", - "@fetch-mock/jest": "^0.2.10", + "@contentstack/utils": "^1.3.18", + "@fetch-mock/jest": "^0.2.12", "es6-promise": "^4.2.8", - "fetch-mock": "^12.2.0", + "fetch-mock": "^12.4.0", "localStorage": "1.0.4", "qs": "^6.14.0" }, @@ -1783,9 +1783,9 @@ "license": "MIT" }, "node_modules/@contentstack/utils": { - "version": "1.3.16", - "resolved": "https://registry.npmjs.org/@contentstack/utils/-/utils-1.3.16.tgz", - "integrity": "sha512-HfVEwh7Da8xV4iZth/ci5bcOqszTx/U2mOzsWbyjHLeOfiU9U7uj6DefrrAPhNhL7JgCq/EpRd3vFtaxiEHBlA==", + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/@contentstack/utils/-/utils-1.3.20.tgz", + "integrity": "sha512-WXkFv5uKrAMs21NPCWe3+7KHYfagenS8rv1/yCDsZ+uV1FvKkzst+MiU1+hcaWHi0E6QaPpYDcxpiltUHo5TSA==", "license": "MIT" }, "node_modules/@csstools/color-helpers": { @@ -1914,12 +1914,12 @@ } }, "node_modules/@fetch-mock/jest": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@fetch-mock/jest/-/jest-0.2.10.tgz", - "integrity": "sha512-nBZUUrYhuCzzmCx0jmGTZOfENf7IhmyYG89WMquHlCkqYSXBJT5PldFg+P107QZcShQPUmqxyLzGHdmsL7mmJw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/@fetch-mock/jest/-/jest-0.2.15.tgz", + "integrity": "sha512-cudDyqZr/mzA/AsXzowx3Il5C7//lOaBn3CW/+gzitGRk621ZPSdlZYbaq3kwxji5vwUaaFQE0saKBLHi2K6fQ==", "license": "MIT", "dependencies": { - "fetch-mock": "^12.3.0" + "fetch-mock": "^12.5.2" }, "engines": { "node": ">=18.11.0" @@ -5199,15 +5199,14 @@ } }, "node_modules/fetch-mock": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-12.3.0.tgz", - "integrity": "sha512-+ZHzLuzrKpP3u5PZo8ghFP1Kr3UJUTZ5PT/uQZtLv7UagDCVRt1bSzVg6MoTFdjQ0GXsx/crq2t0tGabkbH2yA==", + "version": "12.5.2", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-12.5.2.tgz", + "integrity": "sha512-b5KGDFmdmado2MPQjZl6ix3dAG3iwCitb0XQwN72y2s9VnWZ3ObaGNy+bkpm1390foiLDybdJ7yjRGKD36kATw==", "license": "MIT", "dependencies": { "@types/glob-to-regexp": "^0.4.4", "dequal": "^2.0.3", "glob-to-regexp": "^0.4.1", - "is-subset-of": "^3.1.10", "regexparam": "^3.0.0" }, "engines": { @@ -5461,6 +5460,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6396,16 +6409,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-subset-of": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/is-subset-of/-/is-subset-of-3.1.10.tgz", - "integrity": "sha512-avvaYgVmYWyaZ1NDFiv4y9JGkrE2je3op1Po4VYKKJKR8H2qVPsg1GZuuXl5elCTxTlwAIsrAjWAs4BVrISFRw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT", - "dependencies": { - "typedescriptor": "3.0.2" - } - }, "node_modules/is-symbol": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", @@ -11000,13 +11003,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedescriptor": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/typedescriptor/-/typedescriptor-3.0.2.tgz", - "integrity": "sha512-hyVbaCUd18UiXk656g/imaBLMogpdijIEpnhWYrSda9rhvO4gOU16n2nh7xG5lv/rjumnZzGOdz0CEGTmFe0fQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT" - }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", diff --git a/package.json b/package.json index c5d28589..e0333705 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "_id": "contentstack@3.19.3", "scripts": { "test": "npm run test:e2e && npm run test:typescript", - "test:e2e": "tape test/index.js | tap-html --out ./tap-html.html", + "test:e2e": "jest --config jest.js.config.js", "test:typescript": "jest --config jest.config.js --testPathPattern=test/typescript", "automate": "node test.js", "build:node": "webpack --config webpack/webpack.node.js", @@ -100,10 +100,10 @@ "webpack-node-externals": "^3.0.0" }, "dependencies": { - "@contentstack/utils": "^1.3.15", - "@fetch-mock/jest": "^0.2.10", + "@contentstack/utils": "^1.3.18", + "@fetch-mock/jest": "^0.2.12", "es6-promise": "^4.2.8", - "fetch-mock": "^12.2.0", + "fetch-mock": "^12.4.0", "localStorage": "1.0.4", "qs": "^6.14.0" } diff --git a/sanity-report-dev11.js b/sanity-report-dev11.js index eea37a6d..9b84ce4e 100644 --- a/sanity-report-dev11.js +++ b/sanity-report-dev11.js @@ -1,6 +1,8 @@ const fs = require("fs"); +const { App } = require("@slack/bolt"); const { JSDOM } = require("jsdom"); const dotenv = require("dotenv"); +const path = require("path"); dotenv.config(); @@ -9,40 +11,38 @@ const user2 = process.env.USER2; const user3 = process.env.USER3; const user4 = process.env.USER4; -const tapHtmlContent = fs.readFileSync("./tap-html.html", "utf8"); -const dom = new JSDOM(tapHtmlContent); -const $ = require("jquery")(dom.window); - -const totalCount = $(".nav a:nth-child(2)") - .text() - .trim() - .replace("Total Count", ""); -const totalPass = $(".nav a:nth-child(3)") - .text() - .trim() - .replace("Total Pass", ""); -const totalFail = $(".nav a:nth-child(4)") - .text() - .trim() - .replace("Total Fail", ""); - -const totalTime = $(".nav a:nth-child(1)") - .text() - .trim() - .replace("Total Time", ""); - -const milliseconds = parseInt(totalTime.replace(/\D/g, ''), 10); -const totalSeconds = Math.floor(milliseconds / 1000); -const durationInMinutes = Math.floor(totalSeconds / 60); -const durationInSeconds = totalSeconds % 60; - -const passedTests = parseInt(totalPass, 10); -const totalTests = parseInt(totalCount, 10); +const data = fs.readFileSync(path.join(__dirname, "tap-html.html"), "utf8"); +const dom = new JSDOM(data); +const textarea = dom.window.document.querySelector( + "#jest-html-reports-result-data" +); +const testResults = JSON.parse(textarea.textContent.trim()); + +const startTime = testResults.startTime; +const endTime = Math.max( + ...testResults.testResults.map((t) => t.perfStats.end) +); +const totalSeconds = (endTime - startTime) / 1000; +const minutes = Math.floor(totalSeconds / 60); +const seconds = (totalSeconds % 60).toFixed(2); +const duration = `${minutes}m ${seconds}s`; + +const summary = { + totalSuites: testResults.numTotalTestSuites, + passedSuites: testResults.numPassedTestSuites, + failedSuites: testResults.numFailedTestSuites, + totalTests: testResults.numTotalTests, + passedTests: testResults.numPassedTests, + failedTests: testResults.numFailedTests, + skippedTests: testResults.numPendingTests + testResults.numTodoTests, + pendingTests: testResults.numPendingTests, + duration: duration, +}; const resultMessage = - passedTests === totalTests - ? `:white_check_mark: Success (${passedTests} / ${totalTests} Passed)` - : `:x: Failure (${passedTests} / ${totalTests} Passed)`; + summary.passedTests === summary.totalTests + ? `:white_check_mark: Success (${summary.passedTests} / ${summary.totalTests} Passed)` + : `:x: Failure (${summary.passedTests} / ${summary.totalTests} Passed)`; const pipelineName = process.env.GO_PIPELINE_NAME; const pipelineCounter = process.env.GO_PIPELINE_COUNTER; @@ -51,42 +51,65 @@ const goCdServer = process.env.GOCD_SERVER; const reportUrl = `http://${goCdServer}/go/files/${pipelineName}/${pipelineCounter}/sanity/1/sanity/test-results/tap-html.html`; let tagUsers = ``; -if (totalFail > 0) { +if (summary.failedTests > 0) { tagUsers = `<@${user1}> <@${user2}> <@${user3}> <@${user4}>`; } const slackMessage = { text: `Dev11, SDK-CDA Sanity -*Result:* ${resultMessage}. ${durationInMinutes}m ${durationInSeconds}s -*Failed Tests:* ${totalFail} +*Result:* ${resultMessage}. ${summary.duration}s +*Failed Tests:* ${summary.failedTests + summary.skippedTests} <${reportUrl}|View Report> ${tagUsers}`, }; -const slackWebhookUrl = process.env.SLACK_WEBHOOK_URL; - -const sendSlackMessage = async (message) => { - const payload = { - text: message, - }; +const app = new App({ + token: process.env.SLACK_BOT_TOKEN, + signingSecret: process.env.SLACK_SIGNING_SECRET, +}); +const sendSlackMessage = async () => { try { - const response = await fetch(slackWebhookUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(payload), + const result = await app.client.chat.postMessage({ + token: process.env.SLACK_BOT_TOKEN, + channel: process.env.SLACK_CHANNEL2, + text: slackMessage.text, // Ensure this is the full object }); - if (!response.ok) { - throw new Error(`Error sending message to Slack: ${response.statusText}`); + if (summary.failedTests > 0) { + await sendFailureDetails(result.ts); // Pass the correct thread timestamp } - - console.log("Message sent to Slack successfully"); } catch (error) { - console.error("Error:", error); + console.error("Error sending Slack message:", error); + } +}; + +const sendFailureDetails = async (threadTs) => { + const failedTestSuites = testResults.testResults.filter( + (suite) => suite.numFailingTests > 0 + ); + if (failedTestSuites.length > 0) { + let failureDetails = "*Failed Test Modules:*\n"; + for (const suite of failedTestSuites) { + let modulePath = suite.testFilePath; + let formattedModuleName = path + .relative(__dirname, modulePath) + .replace(/^test\//, "") + .replace(/\.js$/, "") + .replace(/\//g, " "); + failureDetails += ` - ${formattedModuleName}: ${suite.numFailingTests} failed\n`; + } + try { + await app.client.chat.postMessage({ + token: process.env.SLACK_BOT_TOKEN, + channel: process.env.SLACK_CHANNEL, + text: failureDetails, + thread_ts: threadTs, + }); + } catch (error) { + console.error("Error sending failure details:", error); + } } }; -sendSlackMessage(slackMessage.text); \ No newline at end of file +sendSlackMessage(slackMessage.text); diff --git a/sanity-report.js b/sanity-report.js index 38810001..9a664f4d 100644 --- a/sanity-report.js +++ b/sanity-report.js @@ -2,42 +2,52 @@ const fs = require('fs'); const { App } = require('@slack/bolt'); const { JSDOM } = require("jsdom"); const dotenv = require('dotenv') +const path = require("path"); + dotenv.config() -const tapHtmlContent = fs.readFileSync('./tap-html.html', 'utf8'); -const report = `./tap-html.html` -const dom = new JSDOM(tapHtmlContent); -const $ = require("jquery")(dom.window); +const data = fs.readFileSync(path.join(__dirname, 'tap-html.html'), 'utf8'); +const dom = new JSDOM(data); +const report = './tap-html.html' +const textarea = dom.window.document.querySelector("#jest-html-reports-result-data"); +const testResults = JSON.parse(textarea.textContent.trim()); -const totalTime = $('.nav a:nth-child(1)').text().trim().replace('Total Time', ''); -const totalCount = $('.nav a:nth-child(2)').text().trim().replace('Total Count', ''); -const totalPass = $('.nav a:nth-child(3)').text().trim().replace('Total Pass', ''); -const totalFail = $('.nav a:nth-child(4)').text().trim().replace('Total Fail', ''); -const totalSkip = $('.nav a:nth-child(5)').text().trim().replace('Total Skip', ''); -const totalTodo = $('.nav a:nth-child(6)').text().trim().replace('Total Todo', ''); +const startTime = testResults.startTime; +const endTime = Math.max(...testResults.testResults.map(t => t.perfStats.end)); +const totalSeconds = (endTime - startTime) / 1000; +const minutes = Math.floor(totalSeconds / 60); +const seconds = (totalSeconds % 60).toFixed(2); +const duration = `${minutes}m ${seconds}s`; -const milliseconds = parseInt(totalTime.replace(/\D/g, ''), 10); -const totalSeconds = Math.floor(milliseconds / 1000); -const durationInMinutes = Math.floor(totalSeconds / 60); -const durationInSeconds = totalSeconds % 60; +const summary = { + totalSuites: testResults.numTotalTestSuites, + passedSuites: testResults.numPassedTestSuites, + failedSuites: testResults.numFailedTestSuites, + totalTests: testResults.numTotalTests, + passedTests: testResults.numPassedTests, + failedTests: testResults.numFailedTests, + skippedTests: testResults.numPendingTests + testResults.numTodoTests, + pendingTests: testResults.numPendingTests, + duration: duration, +}; -console.log('Total Test Suits:', '9') -console.log('Total Tests:', totalCount); -console.log('Total Pass:', totalPass); -console.log('Total Fail:', totalFail); -console.log('Total Skip:', totalSkip); -console.log('Total Pending:', totalTodo); -console.log('Total Duration:', `${durationInMinutes}m`,`${durationInSeconds.toFixed(2)}s`); +console.log('Total Test Suits:', summary.totalSuites) +console.log('Total Tests:', summary.totalTests); +console.log('Total Pass:', summary.passedTests); +console.log('Total Fail:', summary.failedTests); +console.log('Total Skip:', summary.skippedTests); +console.log('Total Pending:', summary.pendingTests); +console.log('Total Duration:', summary.duration); const slackMessage = ` *Test Summary of JS Delivery SDK* -• Total Test Suits: *9* -• Total Tests: *${totalCount}* -• Total Pass:: *${totalPass}* -• Total Fail: *${totalFail}* -• Total Skip:: *${totalSkip}* -• Total Pending: *${totalTodo}* -• Total Duration: *${durationInMinutes}m ${durationInSeconds}s* +• Total Test Suits: *${summary.totalSuites}* +• Total Tests: *${summary.totalTests}* +• Total Pass:: *${summary.passedTests}* +• Total Fail: *${summary.failedTests}* +• Total Skip:: *${summary.skippedTests}* +• Total Pending: *${summary.pendingTests}* +• Total Duration: *${duration}* ` const app = new App({ diff --git a/test/asset/find-result-wrapper.js b/test/asset/find-result-wrapper.js index bfcf8ad1..5c03e016 100755 --- a/test/asset/find-result-wrapper.js +++ b/test/asset/find-result-wrapper.js @@ -1,787 +1,1114 @@ -'use strict'; +"use strict"; /* * Module Dependencies. */ -var test = require('tape'); -var Contentstack = require('../../dist/node/contentstack.js'); -var init = require('../config.js'); -var Utils = require('../entry/utils.js'); - -var Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); - - -test('default .find() no fallback', function(assert) { - var _in = ['ja-jp'] - Stack.Assets().Query().language('ja-jp').toJSON().find() - .then((assets) => { - assert.ok(assets[0].length, 'Assets present in the resultset'); - assert.notok(assets[1], 'Count should not be present'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (_in.indexOf(asset['publish_details']['locale']) != -1); - }); - assert.equal(_assets, true, "Publish content fallback"); - } - assert.end(); - }).catch((error) => { - assert.fail("asset default .find() fallback catch", error.toString()); - assert.end(); - }) -}) -test('default .find() fallback', function(assert) { - var _in = ['ja-jp', 'en-us'] - Stack.Assets().Query().language('ja-jp').includeFallback().toJSON().find() - .then((assets) => { - assert.ok(assets[0].length, 'Assets present in the resultset'); - assert.notok(assets[1], 'Count should not be present'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (_in.indexOf(asset['publish_details']['locale']) != -1); - }); - assert.equal(_assets, true, "Publish content fallback"); - } - assert.end(); - }).catch((error) => { - assert.fail("asset default .find() fallback catch", error.toString()); - assert.end(); - }) -}) -test('default .find()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - Query - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.ok(!assets[1], 'Count should not present in the result'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - prev = asset[field]; - return (asset.updated_at <= prev); - }); - assert.equal(_assets, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail("default .find()"); - assert.end(); - }); -}); - -/*! - * SORTING - * !*/ -test('.ascending()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - - Query - .ascending(field) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - prev = asset[field]; - return (asset[field] >= prev); - }); - assert.equal(_assets, true, "assets sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".ascending()"); - assert.end(); - }); -}); - -test('.descending()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'created_at'; - - Query - .descending(field) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - prev = asset[field]; - return (asset[field] >= prev); - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".descending()"); - assert.end(); - }); -}); - - -/*! - * COMPARISION - * !*/ -test('.lessThan()', function(assert) { - var Query = Stack.Assets().Query(), - value = 5122, - field = 'updated_at'; - Query - .lessThan('file_size', value) - .language('en-us') - .toJSON() - .find() - .then(function success(assets) { - // assert.ok("assets" in result, 'assets key present in the resultset'); - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 1, 'one asset present in the resultset') - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = true; - _assets = assets[0].slice(1).every(function(asset) { - var flag = (asset[field] < value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".lessThan()"); - assert.end(); - }); -}); - -test('.lessThanOrEqualTo()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at', - value = 5122; - Query - .language('en-us') - .lessThanOrEqualTo('file_size', value) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 2, 'two assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".lessThanOrEqualTo()"); - assert.end(); - }); -}); - -test('.greaterThan()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'file_size', - value = 5122; - - Query - .greaterThan('file_size', value) - .ascending(field) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 3, 'three assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].slice(1).every(function(asset) { - var flag = (asset[field] > value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".greaterThan()"); - assert.end(); - }); -}); - -test('.greaterThanOrEqualTo()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'file_size', - value = 5122; - - Query - .greaterThanOrEqualTo('file_size', value) - .descending(field) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 4, 'four assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] >= value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".greaterThanOrEqualTo()"); - assert.end(); - }); -}); - -test('.notEqualTo()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'file_size', - value = 5122; - - Query - .language('en-us') - .notEqualTo('file_size', value) - .descending(field) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 4, 'four assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] != value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notEqualTo()"); - assert.end(); - }); -}); - -/*! - * Array/Subset - * !*/ - -test('.containedIn()', function(assert) { - var Query = Stack.Assets().Query(), - _in = ["image1", "image2"], - field = 'updated_at'; - - Query - .containedIn('title', _in) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 2, 'two assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (_in.indexOf(asset['title']) != -1); - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".containedIn()"); - assert.end(); - }); -}); - -test('.notContainedIn()', function(assert) { - var Query = Stack.Assets().Query(), - _in = ["sourceddd1", "sourceddddd2"]; - - Query - .notContainedIn('title', _in) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'No asset present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notContainedIn()"); - assert.end(); - }); -}); - - -/*! - *Element(exists) - * !*/ - -test('.exists()', function(assert) { - var Query = Stack.Assets().Query(), - queryField = "is_dir", - field = 'updated_at'; - - Query - .language('en-us') - .exists(queryField) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets should not be present in the resultset'); - assert.equal(assets[0].length, 5, 'five assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".exists()"); - assert.end(); - }); -}); - -test('.notExists()', function(assert) { - var Query = Stack.Assets().Query(), - queryField = "is_dir", - field = 'updated_at'; - - Query - .notExists(queryField) - .toJSON() - .find() - .then(function success(assets) { - assert.notok(assets[0].length, 'No asset present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - return (asset[field] <= prev); - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notExists()"); - assert.end(); +const Contentstack = require("../../dist/node/contentstack.js"); +const init = require("../config.js"); +const Utils = require("../entry/utils.js"); + +let Stack; + +describe("Contentstack Asset Tests", () => { + // Initialize the Contentstack Stack Instance + beforeAll(() => { + return new Promise((resolve) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(resolve, 1000); + }); + }); + + describe("default .find() No fallback", () => { + const _in = ["ja-jp"]; + let assets; + + // Setup - run the query once for all tests + beforeAll(async () => { + try { + assets = await Stack.Assets().Query().language("ja-jp").toJSON().find(); + } catch (error) { + console.error("Error in beforeAll:", error); + throw error; + } + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should not include count when not requested", async () => { + expect(assets[1]).toBeFalsy(); + }); + + test("should return assets only in the requested locale", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsInRequestedLocale = assets[0].every((asset) => { + return _in.indexOf(asset["publish_details"]["locale"]) !== -1; }); -}); - - -// Pagination -test('.skip()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - - Query - .toJSON() - .find() - .then(function success(allassets) { - // assert.ok("assets" in allassets, 'assets key present in the resultset'); - Stack - .Assets() - .Query() - .skip(1) - .toJSON() - .find() - .then(function success(assets) { - // assert.ok("assets" in result, 'assets key present in the resultset'); - assert.ok((assets[0].length >= 2), '2 or more assets present in the resultset'); - assert.deepEqual(allassets[0].slice(1), assets[0], 'All elements matched.'); - if (assets && assets.length && assets[0].length) { - allassets[0] = allassets[0].slice(1); - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(""); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail("skip()"); - assert.end(); + expect(allAssetsInRequestedLocale).toBe(true); + } else { + // Skip this test if no assets are returned + console.warn("No assets returned to verify locale"); + } + }); + + test("should have the correct structure for each asset", async () => { + if (assets && assets.length && assets[0].length) { + const firstAsset = assets[0][0]; + expect(firstAsset).toHaveProperty("uid"); + expect(firstAsset).toHaveProperty("title"); + expect(firstAsset).toHaveProperty("publish_details"); + expect(firstAsset.publish_details).toHaveProperty("locale"); + expect(firstAsset.publish_details.locale).toBe("ja-jp"); + } else { + // Skip this test if no assets are returned + console.warn("No assets returned to verify structure"); + } + }); + }); + + describe("default .find() with fallback", () => { + const _in = ["ja-jp", "en-us"]; + let assets; + + // Setup - run the query once for all tests + beforeAll(async () => { + try { + assets = await Stack.Assets() + .Query() + .language("ja-jp") + .includeFallback() + .toJSON() + .find(); + } catch (error) { + console.error("Error in beforeAll:", error); + throw error; + } + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should not include count when not requested", async () => { + expect(assets[1]).toBeFalsy(); + }); + + test("should return assets from both primary and fallback locales", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsInAllowedLocales = assets[0].every((asset) => { + return _in.indexOf(asset["publish_details"]["locale"]) !== -1; }); -}); - -test('.limit()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - - Query - .toJSON() - .find() - .then(function success(allassets) { - // assert.ok("assets" in allassets, 'assets key present in the resultset'); - Stack - .Assets() - .Query() - .limit(2) - .toJSON() - .find() - .then(function success(assets) { - // assert.ok("assets" in result, 'assets key present in the resultset'); - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.deepEqual(allassets[0].slice(0, 2), assets[0], 'All elements matched.'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); + expect(allAssetsInAllowedLocales).toBe(true); + } else { + // Skip this test if no assets are returned + console.warn("No assets returned to verify locales with fallback"); + } + }); + + test("should include some assets in primary locale", async () => { + if (assets && assets.length && assets[0].length) { + const anyAssetsInPrimaryLocale = assets[0].some((asset) => { + return asset["publish_details"]["locale"] === "ja-jp"; }); -}); - -test('.count()', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .count() - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0], 'assets count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".count()"); - assert.end(); + expect(anyAssetsInPrimaryLocale).toBe(true); + } else { + console.warn("No assets returned to verify primary locale presence"); + } + }); + + test("should have the correct structure for each asset", async () => { + if (assets && assets.length && assets[0].length) { + const firstAsset = assets[0][0]; + expect(firstAsset).toHaveProperty("uid"); + expect(firstAsset).toHaveProperty("title"); + expect(firstAsset).toHaveProperty("publish_details"); + expect(firstAsset.publish_details).toHaveProperty("locale"); + expect( + ["ja-jp", "en-us"].includes(firstAsset.publish_details.locale) + ).toBe(true); + } else { + console.warn("No assets returned to verify structure"); + } + }); + }); + + describe("default .find()", () => { + let assets; + const field = "updated_at"; + + // Setup - run the query once for all tests + beforeAll(async () => { + try { + const Query = Stack.Assets().Query(); + assets = await Query.toJSON().find(); + } catch (error) { + console.error("Error in beforeAll:", error); + throw error; + } + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should not include count when not requested", async () => { + expect(assets[1]).toBeFalsy(); + }); + + test("should return assets sorted by updated_at by default in descending order", async () => { + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const allAssetsSorted = assets[0].every((asset) => { + const isSorted = asset[field] <= prev; + prev = asset[field]; + return isSorted; }); -}); - - - -// Logical -test('.or() - Query Objects', function(assert) { - var Query1 = Stack.Assets().Query().containedIn('title', ['image1', 'image2']); - var Query2 = Stack.Assets().Query().where('is_dir', true); - var Query = Stack.Assets().Query(); - - Query - .or(Query1, Query2) + expect(allAssetsSorted).toBe(true); + } else { + console.warn("No assets returned to verify sorting"); + } + }); + }); + + describe("sorting", () => { + test(".ascending()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + try { + const assets = await Query.ascending(field).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + prev = asset[field]; + return asset[field] >= prev; + }); + expect(_assets).toBe(true); + } + } catch (err) { + console.error("Error:", err); + fail(".ascending()"); + } + }); + + test(".descending()", async () => { + const Query = Stack.Assets().Query(); + const field = "created_at"; + try { + const assets = await Query.descending(field).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + } catch (err) { + console.error("Error:", err); + fail(".descending()"); + } + }); + }); + + test(".addParam()", async () => { + const Query = Stack.Assets().Query(); + + try { + const assets = await Query.addParam("include_dimension", "true") .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (~(asset.title === 'image1' || asset.is_dir === true)); - }); - assert.ok(_assets, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".or() - Query Objects"); - assert.end(); + .find(); + expect(assets[0][0].hasOwnProperty("dimension")).toBeTruthy(); + } catch (err) { + console.error("Error:", err); + fail(".addParam()"); + } + }); + + describe("comparison", () => { + describe(".lessThan()", () => { + const field = "file_size"; + const value = 5122; + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.lessThan(field, value).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets with file_size less than the specified value", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every( + (asset) => asset[field] < value + ); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn("No assets returned to verify lessThan condition"); + } + }); + }); + + describe(".lessThanOrEqualTo()", () => { + const field = "file_size"; + const value = 5122; + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.lessThanOrEqualTo(field, value).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets with file_size less than or equal to the specified value", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every( + (asset) => asset[field] <= value + ); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn( + "No assets returned to verify lessThanOrEqualTo condition" + ); + } + }); + }); + + test(".greaterThan()", async () => { + const Query = Stack.Assets().Query(); + const field = "file_size"; + const value = 5122; + try { + const assets = await Query.greaterThan("file_size", value) + .ascending(field) + .toJSON() + .find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].slice(1).every((asset) => { + const flag = asset[field] > value; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + } catch (err) { + fail(".greaterThan()"); + } + }); + + test(".greaterThanOrEqualTo()", async () => { + const Query = Stack.Assets().Query(); + const field = "file_size"; + const value = 5122; + try { + const assets = await Query.greaterThanOrEqualTo("file_size", 5122) + .descending(field) + .toJSON() + .find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] >= value; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + } catch (err) { + console.error("Error:", err); + fail(".greaterThanOrEqualTo()"); + } + }); + + describe(".notEqualTo()", () => { + const field = "file_size"; + const value = 5122; + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.notEqualTo(field, value) + .descending(field) + .toJSON() + .find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets with file_size not equal to the specified value", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every( + (asset) => asset[field] !== value + ); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn("No assets returned to verify notEqualTo condition"); + } + }); + }); + + describe(".where()", () => { + const title = "image1"; + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.where("title", title).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return exactly one asset matching the title", async () => { + expect(assets[0].length).toBe(1); + }); + + test("should return only assets with the specified title", async () => { + if (assets && assets.length && assets[0].length) { + const matchingTitle = assets[0].every( + (asset) => asset.title === title + ); + expect(matchingTitle).toBe(true); + } else { + console.warn("No assets returned to verify where condition"); + } + }); + }); + + describe(".equalTo() with boolean values", () => { + describe("when comparing with false", () => { + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.language("en-us") + .equalTo("is_dir", false) + .toJSON() + .find(); }); -}); -test('.and() - Query Objects', function(assert) { - var Query1 = Stack.Assets().Query().where('title', 'image1'); - var Query2 = Stack.Assets().Query().where('is_dir', true); - var Query = Stack.Assets().Query(); - - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(function success(assets) { - assert.notok(assets[0].length, 'asset not present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (~(asset.title === 'image1' && asset.is_dir === true)); - }); - assert.ok(_assets, '$AND condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".and() - Query Objects"); - assert.end(); + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); }); -}); - -test('.and() - Raw queries', function(assert) { - var Query1 = Stack.Assets().Query().where('title', 'image1'); - var Query2 = Stack.Assets().Query().where('is_dir', true); - var Query = Stack.Assets().Query(); - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(function success(assets) { - assert.notok(assets[0].length, 'asset not present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return ((asset.title === 'image1' && asset.is_dir === true)); - }); - assert.ok(_assets, '$AND condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".and() - Raw queries"); - assert.end(); + test("should return exactly 5 assets matching the condition", async () => { + expect(assets[0].length).toBe(5); }); -}); - -// Custom query -test('.query() - Raw query', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .query({ "$or": [{ "title": "image1" }, { "is_dir": "true" }] }) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 1, 'one asset present in resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (asset.title === 'image1' || asset.is_dir === true) - }); - assert.ok(_assets, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".query() - Raw query"); - assert.end(); + test("should return only assets with is_dir set to false", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every( + (asset) => asset.is_dir === false + ); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn("No assets returned to verify equalTo condition"); + } }); -}); + }); -test('Non reference .tags() ', function(assert) { - var Query = Stack.Assets().Query(), - tags = ["asset3"]; + describe("when comparing with true", () => { + let assets; - Query - .tags(tags) - .toJSON() - .find() - .then(function success(assets) { - assert.ok((assets.length >= 1), '1 or more asset/assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - assert.equal(assets[0].length, 0, 'Non refernce tags count should be zero'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".tags()"); - assert.end(); + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.equalTo("is_dir", true).toJSON().find(); }); -}); -// tags -test('.tags()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'tags', - tags = ["asset1", "asset2"]; - - Query - .tags(tags) - .toJSON() - .find() - .then(function success(assets) { - assert.ok((assets.length >= 1), '1 or more asset/assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (Utils.arrayPresentInArray(tags, asset[field])); - }); - assert.equal(_assets, true, 'Tags specified are found in result set'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".tags()"); - assert.end(); - }); -}); - - -// search -test('.search()', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .search('image1') - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, '1 or more asset present in the resultset'); - assert.equal(assets[0].length, 1, '1 asset present in resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".search()"); - assert.end(); - }); -}); - -// regex -test('.regex()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'title', - regex = { - pattern: '^image', - options: 'i' - }, - regexpObj = new RegExp(regex.pattern, regex.options); - - Query - .language('en-us') - .regex(field, regex.pattern, regex.options) - .toJSON() - .find() - .then(function success(assets) { - assert.ok((assets.length >= 1), '1 or more asset/assets present in the resultset'); - assert.equal(assets[0].length, 5, '5 assets present in resultset'); - var flag = assets[0].every(function(asset) { - return regexpObj.test(asset[field]); - }); - assert.ok(flag, "regexp satisfied for all the assets in the resultset"); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".regex()"); - assert.end(); - }); -}); - - - -// includeCount -test('.includeCount()', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .includeCount() - .toJSON() - .find() - .then(function success(assets) { - // assert.ok("assets" in result, 'assets key present in the resultset'); - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.ok(assets[1], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeCount()"); - assert.end(); - }); -}); - -// only -test('.only() - Single String Parameter', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .only('title') - .toJSON() - .find() - .then(function success(assets) { - var flag = assets[0].every(function(asset) { - return (asset && Object.keys(asset).length === 5 && "title" in asset && "uid" in asset && 'url' in asset); - }); - assert.ok(flag, 'assets with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - Single String Parameter"); - assert.end(); - }); -}); - -test('.only() - Multiple String Parameter', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .only('BASE', 'title') - .toJSON() - .find() - .then(function success(assets) { - var flag = assets[0].every(function(asset) { - return (asset && Object.keys(asset).length === 5 && "title" in asset && "uid" in asset && 'url' in asset); - }); - assert.ok(flag, 'assets with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - Multiple String Parameter"); - assert.end(); + test("should return an empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBe(0); }); + }); + }); + }); + + describe("Array/Subset Tests", () => { + describe(".containedIn()", () => { + const _in = ["image1", "image2"]; + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.containedIn("title", _in).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets with titles contained in the specified array", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every((asset) => { + return _in.indexOf(asset["title"]) !== -1; + }); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn("No assets returned to verify containedIn condition"); + } + }); + + test("should include at least one asset with each of the specified titles", async () => { + if (assets && assets.length && assets[0].length) { + // Check if at least one asset exists for each title in the array + const foundTitles = _in.filter((title) => + assets[0].some((asset) => asset.title === title) + ); + expect(foundTitles.length).toBe(_in.length); + } else { + console.warn("No assets returned to verify all titles are present"); + } + }); + }); + + describe(".notContainedIn()", () => { + const _in = ["image1", "image2"]; + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.notContainedIn("title", _in).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets with titles not contained in the specified array", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every((asset) => { + return _in.indexOf(asset["title"]) === -1; + }); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn("No assets returned to verify notContainedIn condition"); + } + }); + + test("should not include any assets with the specified titles", async () => { + if (assets && assets.length && assets[0].length) { + const foundForbiddenTitles = assets[0].filter((asset) => + _in.includes(asset.title) + ); + expect(foundForbiddenTitles.length).toBe(0); + } else { + console.warn("No assets returned to verify excluded titles"); + } + }); + }); + }); + + describe("Element Existence Tests", () => { + test(".exists()", async () => { + const Query = Stack.Assets().Query(); + const queryField = "is_dir"; + const field = "updated_at"; + try { + const assets = await Query.exists(queryField).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + } catch (err) { + console.error("Error:", err); + fail(".exists()"); + } + }); + + test(".notExists()", async () => { + const Query = Stack.Assets().Query(); + const queryField = "is_dir"; + const field = "updated_at"; + try { + const assets = await Query.notExists(queryField).toJSON().find(); + + expect(assets[0].length).toBeFalsy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + return asset[field] <= prev; + }); + expect(_assets).toBe(true); + } + } catch (err) { + console.error("Error:", err); + fail(".notExists()"); + } + }); + }); + + describe("Pagination Tests", () => { + test(".skip()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + try { + const allassets = await Query.toJSON().find(); + const assets = await Stack.Assets().Query().skip(1).toJSON().find(); + + expect(assets[0].length >= 2).toBeTruthy(); + expect(allassets[0].slice(1)).toEqual(assets[0]); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + } catch (err) { + console.error("Error:", err); + fail(".skip()"); + } + }); + + test(".limit()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + try { + const allassets = await Query.toJSON().find(); + const assets = await Stack.Assets().Query().limit(2).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + expect(allassets[0].slice(0, 2)).toEqual(assets[0]); + + if (assets && assets.length && assets[0] && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + } catch (err) { + console.error("Error:", err); + fail(".limit()"); + } + }); + + test(".count()", async () => { + const Query = Stack.Assets().Query(); + try { + const count = await Query.count().toJSON().find(); + expect(count).toBeTruthy(); + } catch (err) { + console.error("Error:", err); + fail(".count()"); + } + }); + }); + + describe("Logical Operators Tests", () => { + describe(".or() - Query Objects", () => { + let assets; + const title = "image1"; + const isDir = true; + + beforeAll(async () => { + const Query1 = Stack.Assets().Query().where("title", title); + const Query2 = Stack.Assets().Query().where("is_dir", isDir); + const Query = Stack.Assets().Query(); + assets = await Query.or(Query1, Query2).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets matching at least one of the specified conditions", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every( + (asset) => asset.title === title || asset.is_dir === isDir + ); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn("No assets returned to verify OR condition"); + } + }); + + test("should include at least one asset matching the title condition", async () => { + if (assets && assets.length && assets[0].length) { + const anyAssetMatchesTitleCondition = assets[0].some( + (asset) => asset.title === title + ); + expect(anyAssetMatchesTitleCondition).toBe(true); + } else { + console.warn("No assets returned to verify first condition"); + } + }); + }); + + describe(".and() - Query Objects", () => { + let assets; + const title = "image1"; + const isDir = true; + + beforeAll(async () => { + const Query1 = Stack.Assets().Query().where("title", title); + const Query2 = Stack.Assets().Query().where("is_dir", isDir); + const Query = Stack.Assets().Query(); + assets = await Query.and(Query1, Query2).toJSON().find(); + }); + + test("should return an empty array when conditions cannot be satisfied simultaneously", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeFalsy(); + }); + + test("should verify that no assets match both conditions", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every( + (asset) => asset.title === title && asset.is_dir === isDir + ); + expect(allAssetsMatchCondition).toBe(true); + } + }); + }); + + describe(".query() - Raw query", () => { + let assets; + const title = "image2"; + const isDir = true; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.query({ + $or: [{ title: title }, { is_dir: isDir }], + }) + .toJSON() + .find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets matching at least one of the specified conditions", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsMatchCondition = assets[0].every( + (asset) => asset.title === title || asset.is_dir === isDir + ); + expect(allAssetsMatchCondition).toBe(true); + } else { + console.warn("No assets returned to verify raw query conditions"); + } + }); + + test("should include at least one asset matching the title condition", async () => { + if (assets && assets.length && assets[0].length) { + const anyAssetMatchesTitleCondition = assets[0].some( + (asset) => asset.title === title + ); + expect(anyAssetMatchesTitleCondition).toBe(true); + } else { + console.warn("No assets returned to verify first condition"); + } + }); + }); + }); + + describe("Tags Tests", () => { + describe(".tags() - empty results", () => { + let assets; + const tags = ["asset3"]; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.tags(tags).toJSON().find(); + }); + + test("should return a properly structured response", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets.length).toBeGreaterThanOrEqual(1); + }); + + test("should return an empty array when no assets match the tags", async () => { + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBe(0); + }); + }); + + describe(".tags() - with results", () => { + let assets; + const field = "tags"; + const tags = ["asset1", "asset2"]; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.tags(tags).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets.length).toBeGreaterThanOrEqual(1); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets with at least one matching tag", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveMatchingTags = assets[0].every((asset) => { + return Utils.arrayPresentInArray(tags, asset[field]); + }); + expect(allAssetsHaveMatchingTags).toBe(true); + } else { + console.warn("No assets returned to verify tags"); + } + }); + + test("should include assets with tags that overlap with the specified tags", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveOverlappingTags = assets[0].every((asset) => { + // Check that asset tags overlap with requested tags + return asset[field].some((tag) => tags.includes(tag)); + }); + expect(allAssetsHaveOverlappingTags).toBe(true); + } else { + console.warn("No assets returned to verify tag overlap"); + } + }); + }); + }); + + describe("Search Tests", () => { + describe(".search()", () => { + let assets; + const searchTerm = "image1"; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.toJSON().search(searchTerm).find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return assets matching the search term", async () => { + if (assets && assets.length && assets[0].length) { + // Verify that each asset contains the search term in some field + // This is a simplified check since search can match across multiple fields + const anyAssetMatchesSearchTerm = assets[0].some( + (asset) => + asset.title.includes(searchTerm) || + (asset.description && asset.description.includes(searchTerm)) + ); + expect(anyAssetMatchesSearchTerm).toBe(true); + } else { + console.warn("No assets returned to verify search results"); + } + }); + }); + + describe(".regex()", () => { + let assets; + const field = "title"; + const regex = { + pattern: "^image", + options: "i", + }; + const regexpObj = new RegExp(regex.pattern, regex.options); + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.regex(field, regex.pattern, regex.options) + .toJSON() + .find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets.length).toBeGreaterThanOrEqual(1); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should return only assets with titles matching the regex pattern", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsTitlesMatchRegex = assets[0].every((asset) => { + return regexpObj.test(asset[field]); + }); + expect(allAssetsTitlesMatchRegex).toBe(true); + } else { + console.warn("No assets returned to verify regex match"); + } + }); + + test('should include assets whose titles start with "image"', async () => { + if (assets && assets.length && assets[0].length) { + const allTitlesStartWithImage = assets[0].every((asset) => + asset.title.toLowerCase().startsWith("image") + ); + expect(allTitlesStartWithImage).toBe(true); + } else { + console.warn("No assets returned to verify specific regex pattern"); + } + }); + }); + }); + + describe("Include Options", () => { + describe(".includeCount()", () => { + let assets; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.includeCount().toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should include count information in the result", async () => { + expect(assets[1]).toBeDefined(); + expect(assets[1]).toBeTruthy(); + }); + + test("should return count as a number", async () => { + expect(typeof assets[1]).toBe("number"); + }); + + test("should return count equal to the number of returned assets", async () => { + expect(assets[1]).toBeGreaterThanOrEqual(assets[0].length); + }); + }); + }); + + describe("Field Projections", () => { + describe(".only() - Single String Parameter", () => { + let assets; + const selectedField = "title"; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.only(selectedField).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should include the selected field in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveSelectedField = assets[0].every( + (asset) => selectedField in asset + ); + expect(allAssetsHaveSelectedField).toBe(true); + } else { + console.warn("No assets returned to verify field projection"); + } + }); + + test("should include system fields along with the selected field", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveRequiredFields = assets[0].every( + (asset) => "title" in asset && "uid" in asset && "url" in asset + ); + expect(allAssetsHaveRequiredFields).toBe(true); + } else { + console.warn("No assets returned to verify system fields"); + } + }); + + test("should limit the total number of fields in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveLimitedFields = assets[0].every( + (asset) => Object.keys(asset).length === 5 + ); + expect(allAssetsHaveLimitedFields).toBe(true); + } else { + console.warn("No assets returned to verify field count"); + } + }); + }); + + describe(".only() - Multiple String Parameters", () => { + let assets; + const selectedFields = ["BASE", "title"]; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.only(...selectedFields) + .toJSON() + .find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should include the title field in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveTitle = assets[0].every( + (asset) => "title" in asset + ); + expect(allAssetsHaveTitle).toBe(true); + } else { + console.warn("No assets returned to verify field projection"); + } + }); + + test("should include system fields in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveSystemFields = assets[0].every( + (asset) => "uid" in asset && "url" in asset + ); + expect(allAssetsHaveSystemFields).toBe(true); + } else { + console.warn("No assets returned to verify system fields"); + } + }); + + test("should limit the total number of fields in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveLimitedFields = assets[0].every( + (asset) => Object.keys(asset).length === 5 + ); + expect(allAssetsHaveLimitedFields).toBe(true); + } else { + console.warn("No assets returned to verify field count"); + } + }); + }); + + describe(".only() - Array Parameter", () => { + let assets; + const selectedFields = ["title", "filename"]; + + beforeAll(async () => { + const Query = Stack.Assets().Query(); + assets = await Query.only(selectedFields).toJSON().find(); + }); + + test("should return a non-empty array of assets", async () => { + expect(assets).toBeDefined(); + expect(Array.isArray(assets)).toBe(true); + expect(assets[0]).toBeDefined(); + expect(assets[0].length).toBeTruthy(); + }); + + test("should include all the selected fields in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveSelectedFields = assets[0].every((asset) => + selectedFields.every((field) => field in asset) + ); + expect(allAssetsHaveSelectedFields).toBe(true); + } else { + console.warn("No assets returned to verify field projection"); + } + }); + + test("should include system fields in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveSystemFields = assets[0].every( + (asset) => "uid" in asset && "url" in asset + ); + expect(allAssetsHaveSystemFields).toBe(true); + } else { + console.warn("No assets returned to verify system fields"); + } + }); + + test("should limit the total number of fields in each asset", async () => { + if (assets && assets.length && assets[0].length) { + const allAssetsHaveLimitedFields = assets[0].every( + (asset) => Object.keys(asset).length === 5 + ); + expect(allAssetsHaveLimitedFields).toBe(true); + } else { + console.warn("No assets returned to verify field count"); + } + }); + }); + }); }); - -test('.only() - Array Parameter', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .only(['title', 'filename']) - .toJSON() - .find() - .then(function success(assets) { - var flag = assets[0].every(function(asset) { - return (asset && Object.keys(asset).length === 5 && "title" in asset && "filename" in asset && "uid" in asset && 'url' in asset); - }); - assert.ok(flag, 'assets with the field title,url in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - Array Parameter"); - assert.end(); - }); -}); \ No newline at end of file diff --git a/test/asset/find.js b/test/asset/find.js index 3acca3e9..ea2aee3c 100755 --- a/test/asset/find.js +++ b/test/asset/find.js @@ -1,817 +1,582 @@ -'use strict'; +"use strict"; /* * Module Dependencies. */ -var test = require('tape'); -var Contentstack = require('../../dist/node/contentstack.js'); -var init = require('../config.js'); -var Utils = require('../entry/utils.js') -var Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); +const Contentstack = require("../../dist/node/contentstack.js"); +const init = require("../config.js"); +const Utils = require("../entry/utils.js"); + +let Stack; + +describe("Contentstack Asset Tests", () => { + // Initialize the Contentstack Stack Instance + beforeAll(() => { + return new Promise((resolve) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(resolve, 1000); + }); + }); + + describe("Language and Fallback Tests", () => { + test("default .find() No fallback", async () => { + const _in = ["ja-jp"]; + + const assets = await Stack.Assets() + .Query() + .language("ja-jp") + .toJSON() + .find(); + expect(assets[0].length).toBeTruthy(); + expect(assets[1]).toBeFalsy(); -test('default .find() No fallback', function(assert) { - var _in = ['ja-jp'] - Stack.Assets().Query().language('ja-jp').toJSON().find() - .then((assets) => { - assert.ok(assets[0].length, 'Assets present in the resultset'); - assert.notok(assets[1], 'Count should not be present'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (_in.indexOf(asset['publish_details']['locale']) != -1); - }); - assert.equal(_assets, true, "Publish content fallback" ); - } - assert.end(); - }).catch((error) => { - assert.fail("asset default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -test('default .find() fallback', function(assert) { - var _in = ['ja-jp', 'en-us'] - Stack.Assets().Query().language('ja-jp').includeFallback().toJSON().find() - .then((assets) => { - assert.ok(assets[0].length, 'Assets present in the resultset'); - assert.notok(assets[1], 'Count should not be present'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (_in.indexOf(asset['publish_details']['locale']) != -1); - }); - assert.equal(_assets, true, "Publish content fallback" ); - } - assert.end(); - }).catch((error) => { - assert.fail("asset default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -test('default .find()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - Query - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'Assets present in the resultset'); - assert.notok(assets[1], 'Count should not be present'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - prev = asset[field]; - return (asset[field] <= prev); - }); - assert.equal(_assets, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail("asset default .find()"); - assert.end(); + if (assets && assets.length && assets[0].length) { + const _assets = assets[0].every((asset) => { + return _in.indexOf(asset["publish_details"]["locale"]) !== -1; }); -}); + expect(_assets).toBe(true); + } + }); -/*! - * SORTING - * !*/ -test('.ascending()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; + test("default .find() fallback", async () => { + const _in = ["ja-jp", "en-us"]; - Query - .ascending(field) + const assets = await Stack.Assets() + .Query() + .language("ja-jp") + .includeFallback() .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - prev = asset[field]; - return (asset[field] >= prev); - }); - assert.equal(_assets, true, "assets sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".ascending()"); - assert.end(); - }); -}); + .find(); -test('.descending()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'created_at'; - Query - .descending(field) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".descending()"); - assert.end(); + expect(assets[0].length).toBeTruthy(); + expect(assets[1]).toBeFalsy(); + + if (assets && assets.length && assets[0].length) { + const _assets = assets[0].every((asset) => { + return _in.indexOf(asset["publish_details"]["locale"]) !== -1; }); -}); + expect(_assets).toBe(true); + } + }); + }); + + test("default .find()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + const assets = await Query.toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + expect(assets[1]).toBeFalsy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + }); + + describe("Sorting", () => { + test(".ascending()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + + const assets = await Query.ascending(field).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] >= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + }); -// addparam -test('.addParam()', function(assert) { - var Query = Stack.Assets().Query(); - Query - .addParam('include_dimension', 'true') - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0][0].hasOwnProperty('dimension'), 'dimension present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".addParam()"); - assert.end(); + test(".descending()", async () => { + const Query = Stack.Assets().Query(); + const field = "created_at"; + + const assets = await Query.descending(field).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; }); -}); + expect(_assets).toBe(true); + } + }); + }); + describe("Params", () => { + test(".addParam()", async () => { + const Query = Stack.Assets().Query(); -/*! - * COMPARISION - * !*/ -test('.lessThan()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'file_size', - value = 5122; - Query - .lessThan('file_size', value) + const assets = await Query.addParam("include_dimension", "true") .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 1, '1 asset present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].slice(1).every(function(asset) { - var flag = (asset[field] < value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error('Error : ', err); - assert.fail(".lessThan()"); - assert.end(); + .find(); + expect(assets[0][0].hasOwnProperty("dimension")).toBeTruthy(); + }); + }); + + describe("Comparison", () => { + test(".lessThan()", async () => { + const Query = Stack.Assets().Query(); + const field = "file_size"; + const value = 5122; + + const assets = await Query.lessThan("file_size", value).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].slice(1).every((asset) => { + const flag = asset[field] < value; + prev = asset[field]; + return flag; }); -}); + expect(_assets).toBe(true); + } + }); + + test(".lessThanOrEqualTo()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; -test('.lessThanOrEqualTo()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - Query - .lessThanOrEqualTo('file_size', 5122) + const assets = await Query.lessThanOrEqualTo("file_size", 5122) .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 2, 'two assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".lessThanOrEqualTo()"); - assert.end(); - }).catch(function(err) { - console.log("error is this: ", err); + .find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; }); -}); + expect(_assets).toBe(true); + } + }); -test('.greaterThan()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'file_size', - value = 5122; + test(".greaterThan()", async () => { + const Query = Stack.Assets().Query(); + const field = "file_size"; + const value = 5122; - Query - .greaterThan('file_size', value) + const assets = await Query.greaterThan("file_size", value) .ascending(field) .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 3, 'three assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].slice(1).every(function(asset) { - var flag = (asset[field] > value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error() { - assert.fail(".greaterThan()"); - assert.end(); - }); -}); + .find(); -test('.greaterThanOrEqualTo()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'file_size', - value = 5122; + expect(assets[0].length).toBeTruthy(); - Query - .greaterThanOrEqualTo('file_size', 5122) - .descending(field) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 4, 'four assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] >= value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".greaterThanOrEqualTo()"); - assert.end(); + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].slice(1).every((asset) => { + const flag = asset[field] > value; + prev = asset[field]; + return flag; }); -}); + expect(_assets).toBe(true); + } + }); -test('.notEqualTo()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'file_size', - value = 5122; + test(".greaterThanOrEqualTo()", async () => { + const Query = Stack.Assets().Query(); + const field = "file_size"; + const value = 5122; - Query - .notEqualTo('file_size', value) + const assets = await Query.greaterThanOrEqualTo("file_size", value) .descending(field) .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] != value); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notEqualTo()"); - assert.end(); - }); -}); + .find(); -test('.where()', function(assert) { - var Query = Stack.Assets().Query(); - Query - .where('title', "image1") - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 1, 'one asset present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".where()"); - assert.end(); - }); -}); + expect(assets[0].length).toBeTruthy(); + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] >= value; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + }); -test('.equalTo() compare boolean value (true)', function(assert) { - var Query = Stack.Assets().Query(); + test(".notEqualTo()", async () => { + const Query = Stack.Assets().Query(); + const field = "file_size"; + const value = 5122; - Query - .language('en-us') - .equalTo('is_dir', false) + const assets = await Query.notEqualTo("file_size", value) + .descending(field) .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.equal(assets[0].length, 5, ' five asset present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".where()"); - assert.end(); - }); -}); + .find(); -test('.equalTo() compare boolean value (false)', function(assert) { - var Query = Stack.Assets().Query(); - Query - .equalTo('is_dir', true) - .toJSON() - .find() - .then(function success(assets) { - assert.notok(assets[0].length, 'assets not present in the resultset'); - assert.equal(assets[0].length, 0, ' three assets present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".where() boolean value having false"); - assert.end(); + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] != value; + prev = asset[field]; + return flag; }); -}); + expect(_assets).toBe(true); + } + }); -/*! - * Array/Subset - * !*/ + test(".where()", async () => { + const Query = Stack.Assets().Query(); -test('.containedIn()', function(assert) { - var Query = Stack.Assets().Query(), - _in = ["image1", "image2"], - field = 'updated_at'; + const assets = await Query.where("title", "image1").toJSON().find(); - Query - .containedIn('title', _in) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.ok(assets[0].length, 2, 'two assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (_in.indexOf(asset['title']) != -1); - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".containedIn()"); - assert.end(); - }); -}); + expect(assets[0].length).toBeTruthy(); + expect(assets[0].length).toBe(1); + }); -test('.notContainedIn()', function(assert) { - var Query = Stack.Assets().Query(), - _in = ["image1", "image2"]; + test(".equalTo() compare boolean value (true)", async () => { + const Query = Stack.Assets().Query(); - Query - .notContainedIn('title', _in) + const assets = await Query.language("en-us") + .equalTo("is_dir", false) .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, ' Assets present in the resultset'); - assert.ok(assets[0].length, 3, 'three assets present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notContainedIn()"); - assert.end(); - }); -}); + .find(); + expect(assets[0].length).toBeTruthy(); + expect(assets[0].length).toBe(5); + }); -/*! - *Element(exists) - * !*/ + test(".equalTo() compare boolean value (false)", async () => { + const Query = Stack.Assets().Query(); -test('.exists()', function(assert) { - var Query = Stack.Assets().Query(), - queryField = "is_dir", - field = 'updated_at'; + const assets = await Query.equalTo("is_dir", true).toJSON().find(); - Query - .exists(queryField) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".exists()"); - assert.end(); - }); -}); + expect(assets[0].length).toBeFalsy(); + expect(assets[0].length).toBe(0); + }); + }); -test('.notExists()', function(assert) { - var Query = Stack.Assets().Query(), - queryField = "is_dir", - field = 'updated_at'; + describe("Array/Subset Tests", () => { + test(".containedIn()", async () => { + const Query = Stack.Assets().Query(); + const _in = ["image1", "image2"]; + const field = "updated_at"; - Query - .notExists(queryField) - .toJSON() - .find() - .then(function success(assets) { - assert.notok(assets[0].length, 'No asset present in the resultset'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - return (asset[field] <= prev); - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notExists()"); - assert.end(); + const assets = await Query.containedIn("title", _in).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + const _assets = assets[0].every((asset) => { + return _in.indexOf(asset["title"]) != -1; }); -}); + expect(_assets).toBe(true); + } + }); + test(".notContainedIn()", async () => { + const Query = Stack.Assets().Query(); + const _in = ["image1", "image2"]; -// Pagination -test('.skip()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; + const assets = await Query.notContainedIn("title", _in).toJSON().find(); - Query - .toJSON() - .find() - .then(function success(allassets) { - Stack - .Assets() - .Query() - .skip(1) - .toJSON() - .find() - .then(function success(assets) { - assert.ok((assets[0].length >= 2), '2 or more assets present in the resultset'); - assert.deepEqual(allassets[0].slice(1), assets[0], 'All elements matched.'); - if (assets && assets.length && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".skip()"); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail(".skip()"); - assert.end(); - }); -}); + expect(assets[0].length).toBeTruthy(); + }); + }); -test('.limit()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; + describe("Element Existence Tests", () => { + test(".exists()", async () => { + const Query = Stack.Assets().Query(); + const queryField = "is_dir"; + const field = "updated_at"; - Query - .toJSON() - .find() - .then(function success(allassets) { - Stack - .Assets() - .Query() - .limit(2) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.deepEqual(allassets[0].slice(0, 2), assets[0], 'All elements matched.'); - if (assets && assets.length && assets[0] && assets[0].length) { - var prev = assets[0][0][field]; - var _assets = assets[0].every(function(asset) { - var flag = (asset[field] <= prev); - prev = asset[field]; - return flag; - }); - assert.equal(_assets, true, "assets sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); - }); -}); + const assets = await Query.exists(queryField).toJSON().find(); -test('.count()', function(assert) { - var Query = Stack.Assets().Query(); + expect(assets[0].length).toBeTruthy(); - Query - .count() - .toJSON() - .find() - .then(function success(count) { - // assert.ok("assets" in result, 'assets key present in the resultset'); - assert.ok(count, 'assets present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".count()"); - assert.end(); + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; }); -}); + expect(_assets).toBe(true); + } + }); + test(".notExists()", async () => { + const Query = Stack.Assets().Query(); + const queryField = "is_dir"; + const field = "updated_at"; -// Logical -test('.or() - Query Objects', function(assert) { - var Query1 = Stack.Assets().Query().where('title', 'image1'); - var Query2 = Stack.Assets().Query().where('is_dir', true); - var Query = Stack.Assets().Query(); + const assets = await Query.notExists(queryField).toJSON().find(); - Query - .or(Query1, Query2) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.ok(assets[0].length, 1, 'one asset present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (~(asset.title === 'source1' || asset.is_dir === true)); - }); - assert.ok(_assets, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".or() - Query Objects"); - assert.end(); + expect(assets[0].length).toBeFalsy(); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + return asset[field] <= prev; }); -}); + expect(_assets).toBe(true); + } + }); + }); + + describe("Pagination Tests", () => { + test(".skip()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + + const allassets = await Query.toJSON().find(); + const assets = await Stack.Assets().Query().skip(1).toJSON().find(); + + expect(assets[0].length >= 2).toBeTruthy(); + expect(allassets[0].slice(1)).toEqual(assets[0]); + + if (assets && assets.length && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + }); + + test(".limit()", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + + const allassets = await Query.toJSON().find(); + const assets = await Stack.Assets().Query().limit(2).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + expect(allassets[0].slice(0, 2)).toEqual(assets[0]); + + if (assets && assets.length && assets[0] && assets[0].length) { + let prev = assets[0][0][field]; + const _assets = assets[0].every((asset) => { + const flag = asset[field] <= prev; + prev = asset[field]; + return flag; + }); + expect(_assets).toBe(true); + } + }); -test('.and() - Query Objects', function(assert) { - var Query1 = Stack.Assets().Query().where('title', 'image1'); - var Query2 = Stack.Assets().Query().where('is_dir', true); - var Query = Stack.Assets().Query(); + test(".count()", async () => { + const Query = Stack.Assets().Query(); - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(function success(assets) { - assert.notok(assets[0].length, ' asset not present in the resultset'); - if (assets && assets.length && assets[0].length) { - // console.log("\n\n\n\n",JSON.stringify(assets)); - var _assets = assets[0].every(function(asset) { - return (~(asset.title === 'image1' && asset.is_dir === true)); - }); - assert.ok(_assets, '$AND condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".and() - Query Objects"); - assert.end(); - }); -}); + const count = await Query.count().toJSON().find(); + expect(count).toBeTruthy(); + }); + }); -// Custom query -test('.query() - Raw query', function(assert) { - var Query = Stack.Assets().Query(); + describe("Logical Operators Tests", () => { + test(".or() - Query Objects", async () => { + const Query1 = Stack.Assets().Query().where("title", "image1"); + const Query2 = Stack.Assets().Query().where("is_dir", true); + const Query = Stack.Assets().Query(); - Query - .query({ "$or": [{ "title": "image2" }, { "is_dir": "true" }] }) - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.ok(assets[0].length, 1, 'one asset present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (asset.title === 'image2' || asset.is_dir === false) - }); - assert.ok(_assets, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".query() - Raw query"); - assert.end(); + const assets = await Query.or(Query1, Query2).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + const _assets = assets[0].every((asset) => { + return ~(asset.title === "source1" || asset.is_dir === true); }); -}); + expect(_assets).toBeTruthy(); + } + }); + test(".and() - Query Objects", async () => { + const Query1 = Stack.Assets().Query().where("title", "image1"); + const Query2 = Stack.Assets().Query().where("is_dir", true); + const Query = Stack.Assets().Query(); -test('.tags()', function(assert) { - var Query = Stack.Assets().Query(), - tags = ["asset3"]; + const assets = await Query.and(Query1, Query2).toJSON().find(); - Query - .tags(tags) - .toJSON() - .find() - .then(function success(assets) { - assert.ok((assets.length >= 1), '1 or more asset/assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - assert.equal(assets[0].length, 0, 'Non refernce tags count should be zero'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".tags()"); - assert.end(); - }); -}); -// tags -test('.tags()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'tags', - tags = ["asset1", "asset2"]; - - Query - .tags(tags) - .toJSON() - .find() - .then(function success(assets) { - assert.ok((assets.length >= 1), '1 or more asset/assets present in the resultset'); - if (assets && assets.length && assets[0].length) { - var _assets = assets[0].every(function(asset) { - return (Utils.arrayPresentInArray(tags, asset[field])); - }); - assert.equal(_assets, true, 'Tags specified are found in result set'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".tags()"); - assert.end(); + expect(assets[0].length).toBeFalsy(); + + if (assets && assets.length && assets[0].length) { + const _assets = assets[0].every((asset) => { + return ~(asset.title === "image1" && asset.is_dir === true); }); -}); + expect(_assets).toBeTruthy(); + } + }); + test(".query() - Raw query", async () => { + const Query = Stack.Assets().Query(); -// search -test('.search()', function(assert) { - var Query = Stack.Assets().Query(); - Query + const assets = await Query.query({ + $or: [{ title: "image2" }, { is_dir: "true" }], + }) .toJSON() - .search('image1') - .find() - .then(function success(assets) { - assert.ok(assets[0].length, '1 asset present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".search()"); - assert.end(); - }); -}); + .find(); -// regex -test('.regex()', function(assert) { - var Query = Stack.Assets().Query(), - field = 'title', - regex = { - pattern: '^image', - options: 'i' - }, - regexpObj = new RegExp(regex.pattern, regex.options); - - Query - .regex(field, regex.pattern, regex.options) - .toJSON() - .find() - .then(function success(assets) { - assert.ok((assets.length >= 1), '1 or more asset/assets present in the resultset'); - var flag = assets[0].every(function(asset) { - return regexpObj.test(asset[field]); - }); - assert.ok(flag, "regexp satisfied for all the assets in the resultset"); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".regex()"); - assert.end(); + expect(assets[0].length).toBeTruthy(); + + if (assets && assets.length && assets[0].length) { + const _assets = assets[0].every((asset) => { + return asset.title === "image2" || asset.is_dir === false; }); -}); + expect(_assets).toBeTruthy(); + } + }); + }); + describe("Tags Tests", () => { + test(".tags() - empty results", async () => { + const Query = Stack.Assets().Query(); + const tags = ["asset3"]; -// includeCount -test('.includeCount()', function(assert) { - var Query = Stack.Assets().Query(); + const assets = await Query.tags(tags).toJSON().find(); - Query - .includeCount() - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - assert.ok(assets[1], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeCount()"); - assert.end(); - }); -}); + expect(assets.length >= 1).toBeTruthy(); + if (assets && assets.length && assets[0].length) { + expect(assets[0].length).toBe(0); + } + }); -// only -test('.only() - Single String Parameter', function(assert) { - var Query = Stack.Assets().Query(); + test(".tags() - with results", async () => { + const Query = Stack.Assets().Query(); + const field = "tags"; + const tags = ["asset1", "asset2"]; - Query - .only('title') - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - var flag = assets[0].every(function(asset) { - return (asset && Object.keys(asset).length === 5 && "title" in asset && "uid" in asset && 'url' in asset); - }); - assert.ok(flag, 'assets with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - Single String Parameter"); - assert.end(); - }); -}); + const assets = await Query.tags(tags).toJSON().find(); -test('.only() - Multiple String Parameter', function(assert) { - var Query = Stack.Assets().Query(); + expect(assets.length >= 1).toBeTruthy(); - Query - .only('BASE', 'title') - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - var flag = assets[0].every(function(asset) { - return (asset && Object.keys(asset).length === 5 && "title" in asset && "uid" in asset && 'url' in asset); - }); - assert.ok(flag, 'assets with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - Multiple String Parameter"); - assert.end(); + if (assets && assets.length && assets[0].length) { + const _assets = assets[0].every((asset) => { + return Utils.arrayPresentInArray(tags, asset[field]); }); -}); - -test('.only() - Array Parameter', function(assert) { - var Query = Stack.Assets().Query(); - - Query - .only(['title', 'filename']) + expect(_assets).toBe(true); + } + }); + }); + + describe("Search Tests", () => { + test(".search()", async () => { + const Query = Stack.Assets().Query(); + + const assets = await Query.toJSON().search("image1").find(); + expect(assets[0].length).toBeTruthy(); + }); + + test(".regex()", async () => { + const Query = Stack.Assets().Query(); + const field = "title"; + const regex = { + pattern: "^image", + options: "i", + }; + const regexpObj = new RegExp(regex.pattern, regex.options); + + const assets = await Query.regex(field, regex.pattern, regex.options) .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'assets present in the resultset'); - var flag = assets[0].every(function(asset) { - return (asset && Object.keys(asset).length === 5 && "title" in asset && "filename" in asset && "uid" in asset && "url" in asset); - }); - assert.ok(flag, 'assets with the field title,filename in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - Array Parameter"); - assert.end(); - }); -}); \ No newline at end of file + .find(); + + expect(assets.length >= 1).toBeTruthy(); + + const flag = assets[0].every((asset) => { + return regexpObj.test(asset[field]); + }); + expect(flag).toBeTruthy(); + }); + }); + + describe("Include Options", () => { + test(".includeCount()", async () => { + const Query = Stack.Assets().Query(); + + const assets = await Query.includeCount().toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + expect(assets[1]).toBeTruthy(); + }); + }); + + describe("Field Projections", () => { + test(".only() - Single String Parameter", async () => { + const Query = Stack.Assets().Query(); + + const assets = await Query.only("title").toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + const flag = assets[0].every((asset) => { + return ( + asset && + Object.keys(asset).length === 5 && + "title" in asset && + "uid" in asset && + "url" in asset + ); + }); + expect(flag).toBeTruthy(); + }); + + test(".only() - Multiple String Parameter", async () => { + const Query = Stack.Assets().Query(); + + const assets = await Query.only("BASE", "title").toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + const flag = assets[0].every((asset) => { + return ( + asset && + Object.keys(asset).length === 5 && + "title" in asset && + "uid" in asset && + "url" in asset + ); + }); + expect(flag).toBeTruthy(); + }); + + test(".only() - Array Parameter", async () => { + const Query = Stack.Assets().Query(); + + const assets = await Query.only(["title", "filename"]).toJSON().find(); + + expect(assets[0].length).toBeTruthy(); + + const flag = assets[0].every((asset) => { + return ( + asset && + Object.keys(asset).length === 5 && + "title" in asset && + "filename" in asset && + "uid" in asset && + "url" in asset + ); + }); + expect(flag).toBeTruthy(); + }); + }); +}); diff --git a/test/asset/image-transformation.js b/test/asset/image-transformation.js index bb761cae..87ac2861 100755 --- a/test/asset/image-transformation.js +++ b/test/asset/image-transformation.js @@ -2,7 +2,6 @@ /* * Module Dependencies. */ -const test = require('tape'); const Contentstack = require('../../dist/node/contentstack.js'); const init = require('./../config.js'); const Utils = require('./../entry/utils.js'); @@ -11,91 +10,145 @@ const Regexp = new RegExp('\\\?', 'g'); let Stack; let Asset; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); - -test('Get All Assets', function(assert) { - Stack - .Assets() - .Query() - .toJSON() - .find() - .then(function success(assets) { - assert.ok(assets[0].length, 'Assets present in the resultset'); - Asset = assets[0][0]; - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail("asset default .find()"); - assert.end(); - }); -}); - -test('Valid URL: single parameter testing', function(assert) { + +describe('Image Transformation Tests', () => { + // Setup - runs before all tests + beforeAll(done => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(done, 1000); + }); + + // Get assets for testing + describe('Get All Assets', () => { + beforeAll(async () => { + try { + const assets = await Stack.Assets().Query().toJSON().find(); + Asset = assets[0][0]; + } catch (error) { + console.error("error:", error); + throw new Error("Failed to get assets"); + } + }); + + test('Should have assets in the resultset', () => { + expect(Asset).toBeDefined(); + }); + }); + + describe('Valid URL: single parameter testing', () => { + let Image; const Params = { - quality: 50 - } - const URL = Asset['url']; - const Image = Stack.imageTransform(URL, Params); - console.log("URL : ", Image, Image.match(Regexp)); - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - for (var key in Params) { - assert.ok((Image.indexOf('?' + key + '=' + Params[key]) !== -1), "Supplied parameter " + key + " found"); - } - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - assert.end(); -}); - -test('Valid URL: multiple parameter testing', function(assert) { + quality: 50 + }; + + beforeAll(() => { + const URL = Asset['url']; + Image = Stack.imageTransform(URL, Params); + }); + + test('Should generate valid URL', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + + test('Should include quality parameter', () => { + expect(Image.includes('?quality=50')).toBe(true); + }); + + test('Should verify URL is valid again', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + }); + + describe('Valid URL: multiple parameter testing', () => { + let Image; const Params = { - quality: 50, - auto: 'webp', - format: 'jpg' - } - const URL = Asset['url']; - const Image = Stack.imageTransform(URL, Params); - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - for (var key in Params) { - assert.ok((Image.indexOf(key + '=' + Params[key]) !== -1), "Supplied parameter " + key + " found"); - } - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - assert.end(); -}); - -test('Invalid URL: single parameter testing', function(assert) { + quality: 50, + auto: 'webp', + format: 'jpg' + }; + + beforeAll(() => { + const URL = Asset['url']; + Image = Stack.imageTransform(URL, Params); + }); + + test('Should generate valid URL', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + + test('Should include quality parameter', () => { + expect(Image.includes('quality=50')).toBe(true); + }); + + test('Should include auto parameter', () => { + expect(Image.includes('auto=webp')).toBe(true); + }); + + test('Should include format parameter', () => { + expect(Image.includes('format=jpg')).toBe(true); + }); + + test('Should verify URL is valid again', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + }); + + describe('Invalid URL: single parameter testing', () => { + let Image; const Params = { - quality: 50 - } - const URL = Asset['url'] + '?'; - const Image = Stack.imageTransform(URL, Params); - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - for (var key in Params) { - assert.ok((Image.indexOf(key + '=' + Params[key]) !== -1), "Supplied parameter " + key + " found"); - } - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - assert.end(); -}); - -test('Invalid URL: multiple parameter testing', function(assert) { + quality: 50 + }; + + beforeAll(() => { + const URL = Asset['url'] + '?'; + Image = Stack.imageTransform(URL, Params); + }); + + test('Should generate valid URL', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + + test('Should include quality parameter', () => { + expect(Image.includes('quality=50')).toBe(true); + }); + + test('Should verify URL is valid again', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + }); + + describe('Invalid URL: multiple parameter testing', () => { + let Image; const Params = { - quality: 50, - auto: 'webp', - format: 'jpg' - } - const URL = Asset['url'] + '?'; - const Image = Stack.imageTransform(URL, Params); - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - for (var key in Params) { - assert.ok((Image.indexOf(key + '=' + Params[key]) !== -1), "Supplied parameter " + key + " found"); - } - assert.ok((Image.match(Regexp).length === 1), "Valid URL is generated"); - assert.end(); + quality: 50, + auto: 'webp', + format: 'jpg' + }; + + beforeAll(() => { + const URL = Asset['url'] + '?'; + Image = Stack.imageTransform(URL, Params); + }); + + test('Should generate valid URL', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + + test('Should include quality parameter', () => { + expect(Image.includes('quality=50')).toBe(true); + }); + + test('Should include auto parameter', () => { + expect(Image.includes('auto=webp')).toBe(true); + }); + + test('Should include format parameter', () => { + expect(Image.includes('format=jpg')).toBe(true); + }); + + test('Should verify URL is valid again', () => { + expect(Image.match(Regexp).length).toBe(1); + }); + }); }); \ No newline at end of file diff --git a/test/asset/spread.js b/test/asset/spread.js index a41067b8..6fe9b0d1 100755 --- a/test/asset/spread.js +++ b/test/asset/spread.js @@ -1,95 +1,63 @@ /** * Created by Aamod Pisat on 09-06-2017. */ -'use strict'; +"use strict"; /* * Module Dependencies. */ -var test = require('tape'); -var Contentstack = require('../../dist/node/contentstack.js'); -var init = require('../config.js'); +const Contentstack = require("../../dist/node/contentstack.js"); +const init = require("../config.js"); -var Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); +let Stack; +describe("Contentstack Asset Tests", () => { + // Initialize the Contentstack Stack Instance + beforeAll(() => { + return new Promise((resolve) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(resolve, 1000); + }); + }); -test('assets as first argument', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; + test("assets as first argument", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; - Query - .limit(1) - .toJSON() - .find() - .spread(function success(assets) { - assert.ok(assets.length, 'assets exists as first parameter'); - if (assets && assets.length) { - var prev = assets[0][field]; - var _assets = assets.every(function(asset) { - prev = asset[field]; - return (asset[field] <= prev); - }); - assert.equal(_assets, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.end(); - }); -}); + const result = await Query.limit(1).toJSON().find(); -test('with assets and count argument', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - Query - .includeCount() - .toJSON() - .find() - .spread(function success(assets, count) { - assert.ok(assets.length, 'assets exists as first parameter'); - assert.ok(count, 'Count exists as second parameter'); - if (assets && assets.length) { - var prev = assets[0][field]; - var _assets = assets.every(function(asset) { - prev = asset[field]; - return (asset[field] <= prev); - }); - assert.equal(_assets, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.end(); - }); -}); + const assets = result[0]; // Using array destructuring + + expect(assets.length).toBeTruthy(); + + if (assets && assets.length) { + let prev = assets[0][field]; + const _assets = assets.every((asset) => { + prev = asset[field]; + return asset[field] <= prev; + }); + expect(_assets).toBe(true); + } + }); -test('with assets and count argument', function(assert) { - var Query = Stack.Assets().Query(), - field = 'updated_at'; - Query - .includeCount() - .toJSON() - .find() - .spread(function success(assets, count) { - assert.ok(assets.length, 'assets exists as first parameter'); - assert.ok(count, 'Count exists as second parameter'); - if (assets && assets.length) { - var prev = assets[0][field]; - var _assets = assets.every(function(asset) { - prev = asset[field]; - return (asset[field] <= prev); - }); - assert.equal(_assets, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.end(); - }); -}); \ No newline at end of file + test("with assets and count argument", async () => { + const Query = Stack.Assets().Query(); + const field = "updated_at"; + + const result = await Query.includeCount().toJSON().find(); + + const [assets, count] = result; // Using array destructuring + + expect(assets.length).toBeTruthy(); + expect(count).toBeTruthy(); + + if (assets && assets.length) { + let prev = assets[0][field]; + const _assets = assets.every((asset) => { + prev = asset[field]; + return asset[field] <= prev; + }); + expect(_assets).toBe(true); + } + }); +}); diff --git a/test/entry/find-result-wrapper.js b/test/entry/find-result-wrapper.js index c6b553f2..a62e73a1 100755 --- a/test/entry/find-result-wrapper.js +++ b/test/entry/find-result-wrapper.js @@ -1,1130 +1,1269 @@ -'use strict'; +"use strict"; /* * Module Dependencies. */ -const test = require('tape'); -const Contentstack = require('../../dist/node/contentstack.js'); -const init = require('../config.js'); -const Utils = require('./utils.js'); +const Contentstack = require("../../dist/node/contentstack.js"); +const init = require("../config.js"); +const Utils = require("./utils.js"); const contentTypes = init.contentTypes; let Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - console.log(init.stack) - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); - -test('default .find()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(!entries[1], 'Count should not present in the result'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - prev = entry[field]; - return (entry.updated_at <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail("default .find()"); - assert.end(); +let error = null; + +describe("ContentStack SDK Tests", () => { + // Initialize the Contentstack Stack Instance + beforeAll(() => { + return new Promise((resolve) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(resolve, 1000); + }); + }); + + describe("default .find()", () => { + let entries; + const field = "updated_at"; + + // Setup - run the query once for all tests + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.toJSON().find(); + }); + + test("should return a non-empty array of entries", async () => { + expect(entries).toBeDefined(); + expect(Array.isArray(entries)).toBe(true); + expect(entries[0]).toBeDefined(); + expect(entries[0].length).toBeTruthy(); + }); + + test("should not include count when not requested", async () => { + expect(entries[1]).toBeFalsy(); + }); + + test("should return entries sorted by updated_at in descending order by default", async () => { + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + prev = entry[field]; + return entry.updated_at <= prev; }); -}); - -/*! - * SORTING - * !*/ -test('.ascending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - - Query - .ascending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - prev = entry[field]; - return (entry[field] >= prev); - }); - assert.equal(_entries, true, "entries sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".ascending()"); - assert.end(); + expect(_entries).toBe(true); + } else { + console.warn("Not enough entries returned to verify default sorting"); + } + }); + + test("should have entries with valid structure", async () => { + if (entries && entries.length && entries[0].length) { + const firstEntry = entries[0][0]; + expect(firstEntry).toHaveProperty("uid"); + expect(firstEntry).toHaveProperty("title"); + expect(firstEntry).toHaveProperty("updated_at"); + } else { + console.warn("No entries returned to verify structure"); + } + }); + }); + + describe("sorting", () => { + test(".ascending()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "updated_at"; + + const entries = await Query.ascending(field).toJSON().find(); + + expect(entries[0].length).toBeTruthy(); + + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + prev = entry[field]; + return entry[field] >= prev; }); -}); + expect(_entries).toBe(true); + } + }); -test('.descending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'created_at'; + test(".descending()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "created_at"; - Query - .descending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - prev = entry[field]; - return (entry[field] >= prev); - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".descending()"); - assert.end(); - }); -}); + const entries = await Query.descending(field).toJSON().find(); + expect(entries[0].length).toBeTruthy(); -/*! - * COMPARISION - * !*/ -test('.lessThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - value = 11, - field = 'updated_at'; - Query - .lessThan('num_field', value) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, '1 Entry present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = true; - _entries = entries[0].slice(1).every(function(entry) { - var flag = (entry[field] < value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".lessThan()"); - assert.end(); + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + prev = entry[field]; + return entry[field] >= prev; }); -}); - -test('.lessThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'updated_at', - value = 11; - Query - .lessThanOrEqualTo('num_field', value) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".lessThanOrEqualTo()"); - assert.end(); + expect(_entries).toBe(true); + } + }); + }); + + describe("comparison", () => { + test(".lessThan()", async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + const value = 11; + const field = "updated_at"; + + const entries = await Query.lessThan("num_field", value).toJSON().find(); + + expect(entries[0].length).toBeTruthy(); + + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].slice(1).every(function (entry) { + const flag = entry[field] < value; + prev = entry[field]; + return flag; }); -}); + expect(_entries).toBe(true); + } + }); + + test(".lessThanOrEqualTo()", async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + const field = "updated_at"; + const value = 11; + + const entries = await Query.lessThanOrEqualTo("num_field", value) + .toJSON() + .find(); -test('.greaterThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; + expect(entries[0].length).toBeTruthy(); - Query - .greaterThan('num_field', value) + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + const flag = entry[field] <= prev; + prev = entry[field]; + return flag; + }); + expect(_entries).toBe(true); + } + }); + + test(".greaterThan()", async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + const field = "num_field"; + const value = 11; + + const entries = await Query.greaterThan("num_field", value) .ascending(field) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].slice(1).every(function(entry) { - var flag = (entry[field] > value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".greaterThan()"); - assert.end(); - }); -}); + .find(); -test('.greaterThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; + expect(entries[0].length).toBeTruthy(); - Query - .greaterThanOrEqualTo('num_field', value) - .descending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] >= value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".greaterThanOrEqualTo()"); - assert.end(); + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].slice(1).every(function (entry) { + const flag = entry[field] > value; + prev = entry[field]; + return flag; }); -}); - -test('.notEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 6; - - Query - .notEqualTo('num_field', value) + expect(_entries).toBe(true); + } + }); + + test(".greaterThanOrEqualTo()", async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + const field = "num_field"; + const value = 11; + + const entries = await Query.greaterThanOrEqualTo("num_field", value) .descending(field) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] != value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notEqualTo()"); - assert.end(); - }); -}); + .find(); -/*! - * Array/Subset - * !*/ + expect(entries[0].length).toBeTruthy(); -test('.containedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["source1", "source2"], - field = 'updated_at'; - - Query - .containedIn('title', _in) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (_in.indexOf(entry['title']) != -1); - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".containedIn()"); - assert.end(); + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + const flag = entry[field] >= value; + prev = entry[field]; + return flag; }); -}); - -test('.notContainedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["sourceddd1", "sourceddddd2"]; - - Query - .notContainedIn('title', _in) + expect(_entries).toBe(true); + } + }); + + test(".notEqualTo()", async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + const field = "num_field"; + const value = 6; + + const entries = await Query.notEqualTo("num_field", value) + .descending(field) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'No Entry present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notContainedIn()"); - assert.end(); - }); -}); - - -/*! - *Element(exists) - * !*/ + .find(); -test('.exists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "boolean", - field = 'updated_at'; + expect(entries[0].length).toBeTruthy(); - Query - .exists(queryField) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries should not be present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".exists()"); - assert.end(); + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + const flag = entry[field] != value; + prev = entry[field]; + return flag; }); -}); - -test('.notExists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "isspecial", - field = 'updated_at'; + expect(_entries).toBe(true); + } + }); + }); - Query - .notExists(queryField) - .toJSON() - .find() - .then(function success(entries) { - assert.ok("entries" in entries, 'Entries key present in the resultset'); - //assert.notok(entries[0].length, 'No entry present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notExists()"); - assert.end(); - }); -}); + describe("array/subset", () => { + test(".containedIn()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const _in = ["source1", "source2"]; + const field = "updated_at"; + const entries = await Query.containedIn("title", _in).toJSON().find(); -// Pagination -test('.skip()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; + expect(entries[0].length).toBeTruthy(); - Query - .toJSON() - .find() - .then(function success(allEntries) { - // assert.ok("entries" in allEntries, 'Entries key present in the resultset'); - Stack - .ContentType(contentTypes.source) - .Query() - .skip(1) - .toJSON() - .find() - .then(function result(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok((entries[0].length >= 2), '2 or more Entries present in the resultset'); - assert.deepEqual(allEntries[0].slice(1), entries[0], 'All elements matched.'); - if (entries && entries.length && entries[0].length) { - allEntries[0] = allEntries[0].slice(1); - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(""); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail("skip()"); - assert.end(); + if (entries && entries.length && entries[0].length) { + const _entries = entries[0].every(function (entry) { + return _in.indexOf(entry["title"]) != -1; }); -}); + expect(_entries).toBe(true); + } + }); -test('.limit()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - - Query - .toJSON() - .find() - .then(function success(allEntries) { - // assert.ok("entries" in allEntries, 'Entries key present in the resultset'); - Stack - .ContentType(contentTypes.source) - .Query() - .limit(2) - .toJSON() - .find() - .then(function result(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.deepEqual(allEntries[0].slice(0, 2), entries[0], 'All elements matched.'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); - }); -}); + test(".notContainedIn()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const _in = ["sourceddd1", "sourceddddd2"]; -test('.count()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + const entries = await Query.notContainedIn("title", _in).toJSON().find(); - Query - .count() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0], 'Entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".count()"); - assert.end(); - }); -}); + expect(entries[0].length).toBeTruthy(); + }); + }); + describe("exists", () => { + test(".exists()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const queryField = "boolean"; + const field = "updated_at"; + const entries = await Query.exists(queryField).toJSON().find(); -// Logical -test('.or() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().containedIn('title', ['source1', 'source2']); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); + expect(entries[0].length).toBeTruthy(); - Query - .or(Query1, Query2) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (~(entry.title === 'source1' || entry.boolean === true)); - }); - assert.ok(_entries, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".or() - Query Objects"); - assert.end(); + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + const flag = entry[field] <= prev; + prev = entry[field]; + return flag; }); -}); + expect(_entries).toBe(true); + } + }); -test('.and() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().where('title', 'source1'); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); + test(".notExists()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const queryField = "isspecial"; + const field = "updated_at"; - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, '1 Entry present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (~(entry.title === 'source1' || entry.boolean === true)); - }); - assert.ok(_entries, '$AND condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".and() - Query Objects"); - assert.end(); - }); -}); + const entries = await Query.notExists(queryField).toJSON().find(); -test('.and() - Raw queries', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().where('title', 'source1'); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); + expect("entries" in entries).toBeTruthy(); - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, '1 Entry present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (~(entry.title === 'source1' || entry.boolean === true)); - }); - assert.ok(_entries, '$AND condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".and() - Raw queries"); - assert.end(); + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + return entry[field] <= prev; }); -}); + expect(_entries).toBe(true); + } + }); + }); + describe("pagination", () => { + test(".skip()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "updated_at"; -// Custom query -test('.query() - Raw query', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + const allEntries = await Query.toJSON().find(); - Query - .query({ "$or": [{ "title": "source1" }, { "boolean": "true" }] }) + const entries = await Stack.ContentType(contentTypes.source) + .Query() + .skip(1) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (entry.title === 'source1' || entry.boolean === true) - }); - assert.ok(_entries, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".query() - Raw query"); - assert.end(); + .find(); + + expect(entries[0].length).toBeGreaterThanOrEqual(2); + expect(allEntries[0].slice(1)).toEqual(entries[0]); + + if (entries && entries.length && entries[0].length) { + allEntries[0] = allEntries[0].slice(1); + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + const flag = entry[field] <= prev; + prev = entry[field]; + return flag; }); -}); + expect(_entries).toBe(true); + } + }); + test(".limit()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "updated_at"; -// tags -test('.tags()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'tags', - tags = ["tag1", "tag2"]; + const allEntries = await Query.toJSON().find(); - Query - .tags(tags) + const entries = await Stack.ContentType(contentTypes.source) + .Query() + .limit(2) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok((entries.length >= 1), '1 or more Entry/Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (Utils.arrayPresentInArray(tags, entry[field])); - }); - assert.equal(_entries, true, 'Tags specified are found in result set'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".tags()"); - assert.end(); - }); -}); + .find(); + expect(entries[0].length).toBeTruthy(); + expect(allEntries[0].slice(0, 2)).toEqual(entries[0]); -// search -test('.search()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .search('source1') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, '1 or more Entry present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".search()"); - assert.end(); + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + const flag = entry[field] <= prev; + prev = entry[field]; + return flag; }); -}); - -// regex -test('.regex()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'title', - regex = { - pattern: '^source', - options: 'i' - }, - regexpObj = new RegExp(regex.pattern, regex.options); - - Query - .regex(field, regex.pattern, regex.options) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok((entries.length >= 1), '1 or more Entry/Entries present in the resultset'); - var flag = entries[0].every(function(entry) { - return regexpObj.test(entry[field]); - }); - assert.ok(flag, "regexp satisfied for all the entries in the resultset"); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".regex()"); - assert.end(); - }); -}); + expect(_entries).toBe(true); + } + }); + + test(".count()", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + + const entries = await Query.count().toJSON().find(); + + expect(entries[0]).toBeTruthy(); + }); + }); + + describe("logical", () => { + describe(".or() - Query Objects", () => { + let entries; + const titles = ["source1", "source2"]; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .containedIn("title", titles); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", true); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entries = await Query.or(Query1, Query2).toJSON().find(); + }); + + test("should return a non-empty array of entries", async () => { + expect(entries).toBeDefined(); + expect(Array.isArray(entries)).toBe(true); + expect(entries[0]).toBeDefined(); + expect(entries[0].length).toBeTruthy(); + }); + + test("should return entries matching at least one of the conditions", async () => { + if (entries && entries.length && entries[0].length) { + const allEntriesMatchAnyCondition = entries[0].every( + (entry) => titles.includes(entry.title) || entry.boolean === true + ); + expect(allEntriesMatchAnyCondition).toBe(true); + } else { + console.warn("No entries returned to verify OR condition"); + } + }); + test("should include entries with title in the specified list", async () => { + if (entries && entries.length && entries[0].length) { + const hasEntryWithTitle = entries[0].some((entry) => + titles.includes(entry.title) + ); + expect(hasEntryWithTitle).toBe(true); + } else { + console.warn("No entries returned to verify first condition"); + } + }); -test('find: without fallback', function(assert) { - var _in = ['ja-jp'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .toJSON() - .find() - .then((entries) => { - assert.ok(entries[0].length, 'Entries present in the resultset'); + test("should include entries with boolean field set to true", async () => { if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (_in.indexOf(entry['publish_details']['locale']) != -1); - }); - assert.equal(_entries, true, "Publish content fallback"); + const hasEntryWithBoolean = entries[0].some( + (entry) => entry.boolean === true + ); + expect(hasEntryWithBoolean).toBe(true); + } else { + console.warn("No entries returned to verify second condition"); } - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -test('find: fallback', function(assert) { - var _in = ['ja-jp', 'en-us'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .includeFallback() - .toJSON() - .find() - .then((entries) => { - assert.ok(entries[0].length, 'Entries present in the resultset'); + }); + }); + + describe(".and() - Query Objects", () => { + let entries; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .where("title", "source1"); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", true); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entries = await Query.and(Query1, Query2).toJSON().find(); + }); + + test("should return a non-empty array of entries", async () => { + expect(entries).toBeDefined(); + expect(Array.isArray(entries)).toBe(true); + expect(entries[0]).toBeDefined(); + expect(entries[0].length).toBeTruthy(); + }); + + test("should return only entries matching all specified conditions", async () => { if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (_in.indexOf(entry['publish_details']['locale']) != -1); - }); - assert.equal(_entries, true, "Publish content fallback"); + const allEntriesMatchAllConditions = entries[0].every( + (entry) => entry.title === "source1" && entry.boolean === true + ); + expect(allEntriesMatchAllConditions).toBe(true); + } else { + console.warn("No entries returned to verify AND condition"); } - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -// includeReference -test('.includeReference() - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && entry['reference'] && typeof entry['reference'] === 'object'); - }); - assert.equal(flag, true, 'all the present reference are included'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeReference() - String"); - assert.end(); - }); -}); + }); -test('.includeReference() - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + test('should include entries with title set to "source1"', async () => { + if (entries && entries.length && entries[0].length) { + const allEntriesHaveCorrectTitle = entries[0].every( + (entry) => entry.title === "source1" + ); + expect(allEntriesHaveCorrectTitle).toBe(true); + } else { + console.warn("No entries returned to verify title condition"); + } + }); - Query - .includeReference(['reference', 'other_reference']) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && entry['reference'] && typeof entry['reference'] === 'object' && entry['other_reference'] && typeof entry['other_reference'] === 'object'); - }); - assert.equal(flag, true, 'all the present reference are included'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeReference() - Array"); - assert.end(); - }); -}); + test("should include entries with boolean field set to true", async () => { + if (entries && entries.length && entries[0].length) { + const allEntriesHaveBooleanTrue = entries[0].every( + (entry) => entry.boolean === true + ); + expect(allEntriesHaveBooleanTrue).toBe(true); + } else { + console.warn("No entries returned to verify boolean condition"); + } + }); + }); + + describe(".query() - Raw query", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.query({ + $or: [{ title: "source1" }, { boolean: true }], + }) + .toJSON() + .find(); + }); + + test("should return a non-empty array of entries", async () => { + expect(entries).toBeDefined(); + expect(Array.isArray(entries)).toBe(true); + expect(entries[0]).toBeDefined(); + expect(entries[0].length).toBeTruthy(); + }); + + test("should return entries matching at least one of the conditions in the raw query", async () => { + if (entries && entries.length && entries[0].length) { + const allEntriesMatchAnyCondition = entries[0].every( + (entry) => entry.title === "source1" || entry.boolean === true + ); + expect(allEntriesMatchAnyCondition).toBe(true); + } else { + console.warn("No entries returned to verify raw query conditions"); + } + }); -// includeCount -test('.includeCount()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + test('should include entries with title "source1"', async () => { + if (entries && entries.length && entries[0].length) { + const hasEntryWithTitle = entries[0].some( + (entry) => entry.title === "source1" + ); + expect(hasEntryWithTitle).toBe(true); + } else { + console.warn( + "No entries returned to verify first raw query condition" + ); + } + }); - Query - .includeCount() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeCount()"); - assert.end(); - }); -}); + test("should include entries with boolean field set to true", async () => { + if (entries && entries.length && entries[0].length) { + const hasEntryWithBoolean = entries[0].some( + (entry) => entry.boolean === true + ); + expect(hasEntryWithBoolean).toBe(true); + } else { + console.warn( + "No entries returned to verify second raw query condition" + ); + } + }); + }); + }); -// includeSchema -test('.includeSchema()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + describe("custom query", () => { + test(".query() - Raw query with basic OR condition", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); - Query - .includeSchema() + const entries = await Query.query({ + $or: [{ title: "source1" }, { boolean: "true" }], + }) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1].length, 'Schema present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeSchema()"); - assert.end(); - }); -}); + .find(); + expect(entries[0].length).toBeTruthy(); -// includeCount && includeSchema -test('.includeCount() and .includeSchema()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeCount() - .includeSchema() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1].length, 'Schema present in the resultset'); - assert.ok(entries[2], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeSchema()"); - assert.end(); + if (entries && entries.length && entries[0].length) { + const _entries = entries[0].every(function (entry) { + return entry.title === "source1" || entry.boolean === true; }); -}); + expect(_entries).toBeTruthy(); + } + }); -// includeContentType -test('.includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + test(".query() - Raw query with AND condition", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); - Query - .includeContentType() + const entries = await Query.query({ + $and: [{ title: "source1" }, { boolean: true }], + }) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeContentType()"); - assert.end(); - }); -}); + .find(); -// includeCount && includeContentType -test('.includeCount() and .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + expect(entries[0].length).toBeTruthy(); - Query - .includeCount() - .includeContentType() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.ok(entries[2], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeCount && includeContentType"); - assert.end(); - }); -}); + const allMatchBothConditions = entries[0].every( + (entry) => entry.title === "source1" && entry.boolean === true + ); + expect(allMatchBothConditions).toBeTruthy(); + }); -// includeSchema && includeContentType -test('.includeSchema() and .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + test(".query() - Raw query with nested conditions", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); - Query - .includeSchema() - .includeContentType() + const entries = await Query.query({ + $and: [ + { title: "source1" }, + { $or: [{ boolean: true }, { url: { $exists: true } }] }, + ], + }) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeCount && includeContentType"); - assert.end(); - }); -}); + .find(); -// includeCount, includeSchema && includeContentType -test('.includeSchema() and .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeCount() - .includeSchema() - .includeContentType() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.ok(entries[2], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeCount && includeContentType"); - assert.end(); - }); -}); + expect(entries[0].length).toBeTruthy(); + const allMatchConditions = entries[0].every( + (entry) => + entry.title === "source1" && + (entry.boolean === true || entry.url !== undefined) + ); + expect(allMatchConditions).toBeTruthy(); + }); + }); -// only -test('.only() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + describe("tags", () => { + test(".tags() - Multiple tags filter", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "tags"; + const tags = ["tag1", "tag2"]; - Query - .only('title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - Single String Parameter"); - assert.end(); - }); -}); + const entries = await Query.tags(tags).toJSON().find(); -test('.only() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + expect(entries.length).toBeGreaterThanOrEqual(1); - Query - .only('BASE', 'title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - Multiple String Parameter"); - assert.end(); + if (entries && entries.length && entries[0].length) { + const _entries = entries[0].every(function (entry) { + return Utils.arrayPresentInArray(tags, entry[field]); }); -}); - -test('.only() - Array Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only(['title', 'url']) + expect(_entries).toBe(true); + } + }); + + test(".tags() - Single tag filter", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "tags"; + const tags = ["tag1"]; + + const entries = await Query.tags(tags).toJSON().find(); + + expect(entries.length).toBeGreaterThanOrEqual(1); + + if (entries && entries.length && entries[0].length) { + const entriesWithTag = entries[0].every( + (entry) => entry[field] && entry[field].includes(tags[0]) + ); + expect(entriesWithTag).toBe(true); + } + }); + + test(".tags() - Empty results with non-existent tag", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const nonExistentTag = ["non_existent_tag_123456"]; + + const entries = await Query.tags(nonExistentTag).toJSON().find(); + + // Should return an array but with empty results + expect(entries).toBeDefined(); + expect(Array.isArray(entries)).toBe(true); + expect(entries[0].length).toBe(0); + }); + }); + + describe("search", () => { + test(".search() - Exact match", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + + const entries = await Query.search("source1").toJSON().find(); + + expect(entries[0].length).toBeTruthy(); + + const hasMatchingEntries = entries[0].some( + (entry) => + entry.title === "source1" || JSON.stringify(entry).includes("source1") + ); + expect(hasMatchingEntries).toBe(true); + }); + + test(".search() - Partial match", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + + const entries = await Query.search("source").toJSON().find(); + + expect(entries[0].length).toBeTruthy(); + + const hasMatchingEntries = entries[0].some( + (entry) => + (entry.title && entry.title.includes("source")) || + JSON.stringify(entry).includes("source") + ); + expect(hasMatchingEntries).toBe(true); + }); + + test(".search() - Case insensitive match", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + + const entries = await Query.search("SOURCE1").toJSON().find(); + + expect(entries[0].length).toBeTruthy(); + + const hasMatchingEntries = entries[0].some( + (entry) => + (entry.title && entry.title.toLowerCase() === "source1") || + JSON.stringify(entry).toLowerCase().includes("source1") + ); + expect(hasMatchingEntries).toBe(true); + }); + }); + + describe("regex", () => { + test(".regex() - Basic pattern match", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "title"; + const regex = { + pattern: "^source", + options: "i", + }; + const regexpObj = new RegExp(regex.pattern, regex.options); + + const entries = await Query.regex(field, regex.pattern, regex.options) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && Object.keys(entry).length === 3 && "title" in entry && "url" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field title,url in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - Array Parameter"); - assert.end(); - }); -}); - -test('.only() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .only('reference', 'title') + .find(); + + expect(entries.length).toBeGreaterThanOrEqual(1); + + const flag = entries[0].every(function (entry) { + return regexpObj.test(entry[field]); + }); + expect(flag).toBeTruthy(); + }); + + test(".regex() - Specific suffix pattern", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "title"; + const regex = { + pattern: "1$", // Matches strings ending with 1 + options: "", + }; + const regexpObj = new RegExp(regex.pattern, regex.options); + + const entries = await Query.regex(field, regex.pattern, regex.options) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - For the reference - String"); - assert.end(); - }); -}); - -test('.only() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .only('reference', ['title']) + .find(); + + expect(entries.length).toBeGreaterThanOrEqual(1); + + if (entries && entries[0].length) { + const matchesPattern = entries[0].every((entry) => + regexpObj.test(entry[field]) + ); + expect(matchesPattern).toBeTruthy(); + + const endsWithOne = entries[0].every( + (entry) => entry[field] && entry[field].endsWith("1") + ); + expect(endsWithOne).toBeTruthy(); + } + }); + + test(".regex() - With wildcard pattern", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const field = "title"; + const regex = { + pattern: "source.*", + options: "i", + }; + const regexpObj = new RegExp(regex.pattern, regex.options); + + const entries = await Query.regex(field, regex.pattern, regex.options) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".only() - For the reference - Array"); - assert.end(); - }); -}); - -// except -test('.except() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('title') + .find(); + + expect(entries.length).toBeGreaterThanOrEqual(1); + + if (entries && entries[0].length) { + const matchesPattern = entries[0].every((entry) => + regexpObj.test(entry[field]) + ); + expect(matchesPattern).toBeTruthy(); + } + }); + }); + + describe("locale and fallback", () => { + test("find: with specific locale", async () => { + const locale = "ja-jp"; + + const entries = await Stack.ContentType(contentTypes.source) + .Query() + .language(locale) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && !("title" in entry)); - }); - assert.ok(flag, 'entries without the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".except() - Single String Parameter"); - assert.end(); - }); -}); - -test('.except() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('BASE', 'title') + .find(); + + expect(entries[0].length).toBeTruthy(); + + if (entries && entries.length && entries[0].length) { + const allEntriesInRequestedLocale = entries[0].every( + (entry) => + entry.publish_details && entry.publish_details.locale === locale + ); + expect(allEntriesInRequestedLocale).toBe(true); + } + }); + + test("find: with fallback enabled for partially localized content", async () => { + const primaryLocale = "ja-jp"; + const fallbackLocale = "en-us"; + + const entries = await Stack.ContentType(contentTypes.source) + .Query() + .language(primaryLocale) + .includeFallback() .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && !("title" in entry)); - }); - assert.ok(flag, 'entries without the field title, url in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".except() - Multiple String Parameter"); - assert.end(); - }); -}); + .find(); -test('.except() - Array of String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + expect(entries[0].length).toBeTruthy(); - Query - .except(['title', 'file']) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && !("title" in entry) && !("file" in entry)); - }); - assert.ok(flag, 'entries without the field title, file in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".except() - Array of String Parameter"); - assert.end(); + if (entries && entries.length && entries[0].length) { + const _entries = entries[0].every(function (entry) { + return [primaryLocale, fallbackLocale].includes( + entry.publish_details.locale + ); }); -}); - -test('.except() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .except('reference', 'title') + expect(_entries).toBe(true); + } + + if (entries && entries.length && entries[0].length > 1) { + const hasPrimaryLocaleEntries = entries[0].some( + (entry) => entry.publish_details.locale === primaryLocale + ); + + const hasFallbackLocaleEntries = entries[0].some( + (entry) => entry.publish_details.locale === fallbackLocale + ); + + expect(hasPrimaryLocaleEntries || hasFallbackLocaleEntries).toBe(true); + } + }); + + test("find: comparing results with and without fallback", async () => { + const locale = "ja-jp"; + + const entriesWithoutFallback = await Stack.ContentType( + contentTypes.source + ) + .Query() + .language(locale) .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - var _flag; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - _flag = true; - _flag = entry.reference.every(function(reference) { - return (reference && !("title" in reference)); - }); - } else { - _flag = false; - } - return (_flag && entry && Object.keys(entry).length === 2 && "reference" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries withthe field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".except() - For the reference - String"); - assert.end(); - }); -}); - -test('.except() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + .find(); - Query - .includeReference('reference') - .only('BASE', ['reference']) - .except('reference', ['title']) + const entriesWithFallback = await Stack.ContentType(contentTypes.source) + .Query() + .language(locale) + .includeFallback() .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - var _flag; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - _flag = true; - _flag = entry.reference.every(function(reference) { - return (reference && !("title" in reference)); - }); - } else { - _flag = false; - } - return (_flag && entry && Object.keys(entry).length === 2 && "reference" in entry && "uid" in entry); + .find(); + + expect(entriesWithFallback[0].length).toBeGreaterThanOrEqual( + entriesWithoutFallback[0].length + ); + + if (entriesWithoutFallback && entriesWithoutFallback[0].length) { + const allInRequestedLocale = entriesWithoutFallback[0].every( + (entry) => entry.publish_details.locale === locale + ); + expect(allInRequestedLocale).toBe(true); + } + }); + }); + + describe("include reference", () => { + describe(".includeReference() - String", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeReference("reference").toJSON().find(); + }); + + test("should return entries with the reference field", () => { + expect(entries[0].length).toBeGreaterThan(0); + }); + + test("should include the reference field as an object", () => { + const allEntriesHaveReference = entries[0].every( + (entry) => + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ); + expect(allEntriesHaveReference).toBe(true); + }); + }); + + describe(".includeReference() - Array", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeReference(["reference", "other_reference"]) + .toJSON() + .find(); + }); + + test("should return entries with data", () => { + expect(entries[0].length).toBeGreaterThan(0); + }); + + test("should include the first reference field as an object", () => { + const allEntriesHaveFirstReference = entries[0].every( + (entry) => + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ); + expect(allEntriesHaveFirstReference).toBe(true); + }); + + test("should include the second reference field as an object", () => { + const allEntriesHaveSecondReference = entries[0].every( + (entry) => + entry && + entry["other_reference"] && + typeof entry["other_reference"] === "object" + ); + expect(allEntriesHaveSecondReference).toBe(true); + }); + }); + }); + + describe("include count and schema", () => { + describe(".includeCount()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeCount().toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include count information", () => { + expect(entries[1]).toBeTruthy(); + }); + }); + + describe(".includeSchema()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeSchema().toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include schema information", () => { + expect(entries[1].length).toBeTruthy(); + }); + }); + + describe(".includeCount() and .includeSchema()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeCount().includeSchema().toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include schema information", () => { + expect(entries[1].length).toBeTruthy(); + }); + + test("should include count information", () => { + expect(entries[2]).toBeTruthy(); + }); + }); + }); + + describe("include contenttypes", () => { + describe(".includeContentType()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeContentType().toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include content type information", () => { + expect(entries[1]).toBeTruthy(); + }); + + test("should include content type title", () => { + expect(entries[1]["title"]).toBeTruthy(); + }); + + test("should have the correct content type UID", () => { + expect(entries[1]["uid"]).toBe(contentTypes.source); + }); + }); + + describe(".includeCount() and .includeContentType()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeCount() + .includeContentType() + .toJSON() + .find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include content type information", () => { + expect(entries[1]).toBeTruthy(); + }); + + test("should include content type title", () => { + expect(entries[1]["title"]).toBeTruthy(); + }); + + test("should have the correct content type UID", () => { + expect(entries[1]["uid"]).toBe(contentTypes.source); + }); + + test("should include count information", () => { + expect(entries[2]).toBeTruthy(); + }); + }); + + describe(".includeSchema() and .includeContentType()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeSchema() + .includeContentType() + .toJSON() + .find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include content type information", () => { + expect(entries[1]).toBeTruthy(); + }); + + test("should include content type title", () => { + expect(entries[1]["title"]).toBeTruthy(); + }); + + test("should have the correct content type UID", () => { + expect(entries[1]["uid"]).toBe(contentTypes.source); + }); + }); + + describe(".includeCount(), .includeSchema() and .includeContentType()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeCount() + .includeSchema() + .includeContentType() + .toJSON() + .find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include content type information", () => { + expect(entries[1]).toBeTruthy(); + }); + + test("should include content type title", () => { + expect(entries[1]["title"]).toBeTruthy(); + }); + + test("should have the correct content type UID", () => { + expect(entries[1]["uid"]).toBe(contentTypes.source); + }); + + test("should include count information", () => { + expect(entries[2]).toBeTruthy(); + }); + }); + }); + + describe("field projections", () => { + describe(".only() - Single String Parameter", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.only("title").toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include only the title and uid fields", () => { + const correctFieldsOnly = entries[0].every( + (entry) => + entry && + Object.keys(entry).length === 2 && + "title" in entry && + "uid" in entry + ); + expect(correctFieldsOnly).toBeTruthy(); + }); + }); + + describe(".only() - Multiple String Parameter", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.only("BASE", "title").toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include only the title and uid fields", () => { + const correctFieldsOnly = entries[0].every( + (entry) => + entry && + Object.keys(entry).length === 2 && + "title" in entry && + "uid" in entry + ); + expect(correctFieldsOnly).toBeTruthy(); + }); + }); + + describe(".only() - Array Parameter", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.only(["title", "url"]).toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should include only the title, url, and uid fields", () => { + const correctFieldsOnly = entries[0].every( + (entry) => + entry && + Object.keys(entry).length === 3 && + "title" in entry && + "url" in entry && + "uid" in entry + ); + expect(correctFieldsOnly).toBeTruthy(); + }); + }); + + describe(".except() - Single String Parameter", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.except("title").toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should exclude the title field", () => { + const titleExcluded = entries[0].every( + (entry) => entry && !("title" in entry) + ); + expect(titleExcluded).toBeTruthy(); + }); + }); + + describe(".except() - Multiple String Parameter", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.except("BASE", "title").toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should exclude the title field", () => { + const titleExcluded = entries[0].every( + (entry) => entry && !("title" in entry) + ); + expect(titleExcluded).toBeTruthy(); + }); + }); + + describe(".except() - Array of String Parameter", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.except(["title", "file"]).toJSON().find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should exclude the title field", () => { + const titleExcluded = entries[0].every( + (entry) => entry && !("title" in entry) + ); + expect(titleExcluded).toBeTruthy(); + }); + + test("should exclude the file field", () => { + const fileExcluded = entries[0].every( + (entry) => entry && !("file" in entry) + ); + expect(fileExcluded).toBeTruthy(); + }); + }); + + describe(".except() - For the reference - String", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .except("reference", "title") + .toJSON() + .find(); + }); + + test("should return entries", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("should properly format entries with reference but without title in references", () => { + const correctFormat = entries[0].every((entry) => { + let hasCorrectReferenceFormat = false; + if ( + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ) { + hasCorrectReferenceFormat = true; + hasCorrectReferenceFormat = entry.reference.every((reference) => { + return reference && !("title" in reference); }); - assert.ok(flag, 'entries with the field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".except() - For the reference - Array"); - assert.end(); + } + + return ( + hasCorrectReferenceFormat && + entry && + Object.keys(entry).length === 2 && + "reference" in entry && + "uid" in entry + ); }); -}); \ No newline at end of file + + expect(correctFormat).toBeTruthy(); + }); + }); + }); +}); diff --git a/test/entry/find.js b/test/entry/find.js index 7c4c2c57..07276a30 100755 --- a/test/entry/find.js +++ b/test/entry/find.js @@ -1,1676 +1,1414 @@ -'use strict'; +"use strict"; /* * Module Dependencies. */ -const test = require('tape'); -const Contentstack = require('../../dist/node/contentstack.js'); -const init = require('../config.js'); -const Utils = require('./utils.js'); +const Contentstack = require("../../dist/node/contentstack.js"); +const init = require("../config.js"); +const Utils = require("./utils.js"); const contentTypes = init.contentTypes; let Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); -test('early_access in stack initialization', function (t) { - const stack = Contentstack.Stack({ ...init.stack, early_access: ['newCDA', 'taxonomy'] }); - t.equal(stack.headers['x-header-ea'], 'newCDA,taxonomy', 'Early access headers should be added'); - t.end(); -}); +describe("ContentStack SDK Tests", () => { + // Setup - Initialize the Contentstack Stack Instance + beforeAll((done) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(done, 1000); + }); + + describe("Stack Initialization", () => { + test("early_access in stack initialization should add headers", () => { + const stack = Contentstack.Stack({ + ...init.stack, + early_access: ["newCDA", "taxonomy"], + }); + expect(stack.headers["x-header-ea"]).toBe("newCDA,taxonomy"); + }); + }); + + describe("Default Find", () => { + let entries; + const field = "updated_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Count should not be present", () => { + expect(entries[1]).toBeFalsy(); + }); + + test("Entries should be sorted by default in descending order of updated_at", () => { + if (entries && entries.length && entries[0].length > 1) { + let prev = entries[0][0][field]; + const sortedCorrectly = entries[0].slice(1).every((entry) => { + const isValid = entry[field] <= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe("Sorting", () => { + describe(".ascending()", () => { + let entries; + const field = "updated_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.ascending(field).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Entries should be sorted in ascending order", () => { + if (entries && entries.length && entries[0].length > 1) { + let prev = entries[0][0][field]; + const sortedCorrectly = entries[0].slice(1).every((entry) => { + const isValid = entry[field] >= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe(".descending()", () => { + let entries; + const field = "created_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.descending(field).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Entries should be sorted in descending order", () => { + if (entries && entries.length && entries[0].length > 1) { + let prev = entries[0][0][field]; + const sortedCorrectly = entries[0].slice(1).every((entry) => { + const isValid = entry[field] <= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + }); + + describe("Parameters", () => { + describe(".addParam()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.addParam("include_count", "true").toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Count should be present", () => { + expect(entries[1]).toBeTruthy(); + }); + }); + }); + + describe("Comparison", () => { + describe(".lessThan()", () => { + let entries; + const field = "num_field"; + const value = 11; + + test("Should return entry in the resultset", async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + + const result = await Query.lessThan("num_field", value).toJSON().find(); + + entries = result; + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have num_field less than specified value", () => { + if (entries && entries.length && entries[0].length) { + const allLessThan = entries[0].every((entry) => entry[field] < value); + expect(allLessThan).toBe(true); + } + }); + }); + + describe(".lessThanOrEqualTo()", () => { + let entries; + const field = "num_field"; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entries = await Query.lessThanOrEqualTo("num_field", value) + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have num_field less than or equal to specified value", () => { + const allLessThanOrEqual = entries[0].every( + (entry) => entry[field] <= value + ); + expect(allLessThanOrEqual).toBe(true); + }); + + test("Entries should be sorted in descending order by default", () => { + const updatedAtField = "updated_at"; + if (entries && entries.length && entries[0].length > 1) { + let prev = entries[0][0][updatedAtField]; + const sortedCorrectly = entries[0].slice(1).every((entry) => { + const isValid = entry[updatedAtField] <= prev; + prev = entry[updatedAtField]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe(".greaterThan()", () => { + let entries; + const field = "num_field"; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entries = await Query.greaterThan("num_field", value) + .ascending(field) + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have num_field greater than specified value", () => { + const allGreaterThan = entries[0].every( + (entry) => entry[field] > value + ); + expect(allGreaterThan).toBe(true); + }); + + test("Entries should be sorted in ascending order", () => { + if (entries && entries.length && entries[0].length > 1) { + let prev = entries[0][0][field]; + const sortedCorrectly = entries[0].slice(1).every((entry) => { + const isValid = entry[field] >= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe(".greaterThanOrEqualTo()", () => { + let entries; + const field = "num_field"; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entries = await Query.greaterThanOrEqualTo("num_field", value) + .descending(field) + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have num_field greater than or equal to specified value", () => { + const allGreaterThanOrEqual = entries[0].every( + (entry) => entry[field] >= value + ); + expect(allGreaterThanOrEqual).toBe(true); + }); + + test("Entries should be sorted in descending order", () => { + if (entries && entries.length && entries[0].length > 1) { + let prev = entries[0][0][field]; + const sortedCorrectly = entries[0].slice(1).every((entry) => { + const isValid = entry[field] <= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe(".notEqualTo()", () => { + let entries; + const field = "num_field"; + const value = 6; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entries = await Query.notEqualTo("num_field", value) + .descending(field) + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have num_field not equal to specified value", () => { + const allNotEqual = entries[0].every((entry) => entry[field] !== value); + expect(allNotEqual).toBe(true); + }); + + test("Entries should be sorted in descending order", () => { + if (entries && entries.length && entries[0].length > 1) { + let prev = entries[0][0][field]; + const sortedCorrectly = entries[0].slice(1).every((entry) => { + const isValid = entry[field] <= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe(".where() with boolean value (true)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.where("boolean", true).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Should return four entries in the resultset", () => { + expect(entries[0].length).toBe(4); + }); + + test("All entries should have boolean field set to true", () => { + const allTrue = entries[0].every((entry) => entry.boolean === true); + expect(allTrue).toBe(true); + }); + }); + + describe(".where() with boolean value (false)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.where("boolean", false).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Should return three entries in the resultset", () => { + expect(entries[0].length).toBe(3); + }); + + test("All entries should have boolean field set to false", () => { + const allFalse = entries[0].every((entry) => entry.boolean === false); + expect(allFalse).toBe(true); + }); + }); + + describe(".where() with empty string", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.where("title", "").toJSON().find(); + }); + + test("Should return zero entries in the resultset", () => { + expect(entries[0].length).toBe(0); + }); + }); + describe(".tags()", () => { + let entries; + const field = "tags"; + const tags = ["tag1", "tag2"]; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.tags(tags).toJSON().find(); + }); + + test("Should return one or more entries in the resultset", () => { + expect(entries.length).toBeGreaterThanOrEqual(1); + }); + + test("All entries should have at least one of the specified tags", () => { + if (entries && entries.length && entries[0].length) { + const allHaveTags = entries[0].every((entry) => + Utils.arrayPresentInArray(tags, entry[field]) + ); + expect(allHaveTags).toBe(true); + } else { + // Skip this test if no entries were found + console.log("No entries found to check tags"); + } + }); + }); + }); + + describe("Array/Subset Tests", () => { + describe(".containedIn()", () => { + let entries; + const _in = ["source1", "source2"]; + const field = "title"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.containedIn("title", _in).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Should return two entries in the resultset", () => { + expect(entries[0].length).toBe(2); + }); + + test("All entries should have title field contained in the specified values", () => { + if (entries && entries.length && entries[0].length) { + const allContained = entries[0].every((entry) => + _in.includes(entry[field]) + ); + expect(allContained).toBe(true); + } + }); + }); -test('default .find()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.notok(entries[1], 'Count should not be present'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail("default .find()"); - assert.end(); + describe(".notContainedIn()", () => { + let entries; + const _in = ["source1", "source2"]; + const field = "title"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.notContainedIn("title", _in).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Should return three entries in the resultset", () => { + expect(entries[0].length).toBe(5); + }); + + test("All entries should have title field not contained in the specified values", () => { + if (entries && entries.length && entries[0].length) { + const allNotContained = entries[0].every( + (entry) => !_in.includes(entry[field]) + ); + expect(allNotContained).toBe(true); + } + }); + }); + test(".exists() should return entries with the specified field", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const queryField = "boolean"; + const field = "updated_at"; + const entries = await Query.exists(queryField).toJSON().find(); + + // Check if entries are returned + expect(entries[0].length).toBeTruthy(); + + // Verify sorting order (descending on updated_at) + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + const flag = entry[field] <= prev; + prev = entry[field]; + return flag; }); -}); + expect(_entries).toBe(true); + } + }); + + test(".notExists() should return entries without the specified field", async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + const queryField = "isspecial"; + const field = "updated_at"; + const entries = await Query.notExists(queryField).toJSON().find(); + + // Check if entries are returned + expect("entries" in entries).toBeTruthy(); + + // Verify sorting order if entries exist + if (entries && entries.length && entries[0].length) { + let prev = entries[0][0][field]; + const _entries = entries[0].every(function (entry) { + return entry[field] <= prev; + }); + expect(_entries).toBe(true); + } + }); + }); + + describe("Pagination Tests", () => { + describe(".skip()", () => { + let allEntries; + let skippedEntries; + const field = "updated_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + allEntries = await Query.toJSON().find(); + + const SkipQuery = Stack.ContentType(contentTypes.source).Query(); + skippedEntries = await SkipQuery.skip(1).toJSON().find(); + }); + + test("All entries should be present in the resultset", () => { + expect(allEntries[0].length).toBeTruthy(); + }); + + test("Skipped entries should be present in the resultset", () => { + expect(skippedEntries[0].length).toBeGreaterThanOrEqual(2); + }); + + test("Skipped entries should match all entries with first skipped", () => { + expect(skippedEntries[0]).toEqual(allEntries[0].slice(1)); + }); + + test("Skipped entries should maintain sorting order", () => { + if ( + skippedEntries && + skippedEntries.length && + skippedEntries[0].length > 1 + ) { + let prev = skippedEntries[0][0][field]; + const sortedCorrectly = skippedEntries[0].slice(1).every((entry) => { + const isValid = entry[field] <= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe(".limit()", () => { + let allEntries; + let limitedEntries; + const field = "updated_at"; + const limitNumber = 2; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + allEntries = await Query.toJSON().find(); + + const LimitQuery = Stack.ContentType(contentTypes.source).Query(); + limitedEntries = await LimitQuery.limit(limitNumber).toJSON().find(); + }); + + test("All entries should be present in the resultset", () => { + expect(allEntries[0].length).toBeTruthy(); + }); + + test("Limited entries should be present in the resultset", () => { + expect(limitedEntries[0].length).toBeTruthy(); + }); + + test("Limited entries should match first N entries from all entries", () => { + expect(limitedEntries[0]).toEqual(allEntries[0].slice(0, limitNumber)); + }); + + test("Limited entries should maintain sorting order", () => { + if ( + limitedEntries && + limitedEntries.length && + limitedEntries[0].length > 1 + ) { + let prev = limitedEntries[0][0][field]; + const sortedCorrectly = limitedEntries[0].slice(1).every((entry) => { + const isValid = entry[field] <= prev; + prev = entry[field]; + return isValid; + }); + expect(sortedCorrectly).toBe(true); + } + }); + }); + + describe(".count()", () => { + let count; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + count = await Query.count().toJSON().find(); + }); + + test("Entries present in the resultset", () => { + expect(count).toBeTruthy(); + }); + }); + }); + + describe("Logical Operations", () => { + describe(".or() - Query Objects", () => { + let entries; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .where("title", "source2"); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", true); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entries = await Query.or(Query1, Query2).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Should return 1 entries in the resultset", () => { + expect(entries[0].length).toBe(5); + }); + + test("All entries should satisfy the OR condition", () => { + if (entries && entries.length && entries[0].length) { + let _entries = entries[0].every(function (entry) { + return ~(entry.title === "source1" || entry.boolean === true); + }); + expect(_entries).toBe(true); + } + }); + }); -/*! - * SORTING - * !*/ -test('.ascending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - - Query - .ascending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - prev = entry[field]; - return (entry[field] >= prev); - }); - assert.equal(_entries, true, "entries sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".ascending()"); - assert.end(); + describe(".and() - Query Objects", () => { + let entries; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .where("title", "source1"); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", true); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entries = await Query.and(Query1, Query2).toJSON().find(); + }); + + test("Should return one entry in the resultset", () => { + expect(entries[0].length).toBe(1); + }); + + test("All entries should satisfy the AND condition", () => { + if (entries && entries.length && entries[0].length) { + const allMatchCondition = entries[0].every( + (entry) => entry.title === "source1" && entry.boolean === true + ); + expect(allMatchCondition).toBe(true); + } + }); + }); + + describe(".query() - Raw query", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.query({ + $or: [{ title: "source2" }, { boolean: "true" }], + }) + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("Should return two entries in the resultset", () => { + expect(entries[0].length).toBe(1); + }); + + test("All entries should satisfy the OR condition", () => { + if (entries && entries.length && entries[0].length) { + const allMatchCondition = entries[0].every( + (entry) => entry.title === "source2" || entry.boolean === false + ); + expect(allMatchCondition).toBe(true); + } + }); + }); + + describe("Search Tests", () => { + describe(".search()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.toJSON().search("source2").find(); }); -}); -test('.descending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'created_at'; - - Query - .descending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".descending()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + }); + + describe("Including Additional Data Tests", () => { + describe(".includeCount() and .includeContentType()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeCount() + .includeContentType() + .toJSON() + .find(); }); -}); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); -// addparam -test('.addParam()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); + test("ContentType should be present in the resultset", () => { + expect(entries[1]).toBeTruthy(); + }); - Query - .addParam('include_count', 'true') - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries length present in the resultset'); - assert.ok(entries[1], 'count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".addParam()"); - assert.end(); + test("ContentType title should exist", () => { + expect(entries[1].title).toBeDefined(); }); -}); + test("ContentType uid should match requested content type", () => { + expect(entries[1].uid).toBe(contentTypes.source); + }); -/*! - * COMPARISION - * !*/ -test('.lessThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - Query - .lessThan('num_field', value) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, '1 Entry present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].slice(1).every(function(entry) { - var flag = (entry[field] < value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error('Error : ', err); - assert.fail(".lessThan()"); - assert.end(); + test("Count should be present in the resultset", () => { + expect(entries[2]).toBeTruthy(); }); -}); + }); -test('.lessThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'updated_at', - value = 11; - - Query - .lessThanOrEqualTo('num_field', value) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".lessThanOrEqualTo()"); - assert.end(); + describe(".includeEmbeddedItems()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeEmbeddedItems().toJSON().find(); }); -}); -test('.greaterThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - - Query - .greaterThan('num_field', value) - .ascending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].slice(1).every(function(entry) { - var flag = (entry[field] > value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted ascending on '" + field + "' field"); - } - assert.end(); - }, function error() { - assert.fail(".greaterThan()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); + }); -test('.greaterThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - - Query - .greaterThanOrEqualTo('num_field', value) - .descending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] >= value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".greaterThanOrEqualTo()"); - assert.end(); + describe(".includeSchema() and .includeContentType()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeSchema() + .includeContentType() + .toJSON() + .find(); }); -}); -test('.notEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 6; - - Query - .notEqualTo('num_field', value) - .descending(field) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] != value); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notEqualTo()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); -test('.where() compare boolean value (true)', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .where('boolean', true) - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.equal(entries[0].length, 4, 'two entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".where()"); - assert.end(); + test("ContentType should be present in the resultset", () => { + expect(entries[1]).toBeTruthy(); }); -}); -test('.where() compare boolean value (false)', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - Query - .where('boolean', false) - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.equal(entries[0].length, 3, ' three entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".where() boolean value having false"); - assert.end(); + test("ContentType title should exist", () => { + expect(entries[1].title).toBeDefined(); }); -}); -test('.where()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .where('title', '') - .toJSON() - .find() - .then(function success(entries) { - assert.equal(entries[0].length, 0, ' zero entry present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".equalTo compare boolean value (true)"); - assert.end(); + test("ContentType uid should match requested content type", () => { + expect(entries[1].uid).toBe(contentTypes.source); + }); + }); + + describe(".includeCount(), .includeSchema() and .includeContentType()", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeCount() + .includeSchema() + .includeContentType() + .toJSON() + .find(); }); -}); -test('.equalTo() compare boolean value (true)', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .equalTo('boolean', true) - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.equal(entries[0].length, 4, ' four entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".where()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); -test('.equalTo() compare boolean value (false)', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - Query - .equalTo('boolean', false) - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.equal(entries[0].length, 3, ' three entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".where() boolean value having false"); - assert.end(); + test("ContentType should be present in the resultset", () => { + expect(entries[1]).toBeTruthy(); }); -}); -// /*! -// * Array/Subset -// * !*/ - -test('.containedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["source1", "source2"], - field = 'updated_at'; - - Query - .containedIn('title', _in) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[0].length, 2, 'two entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (_in.indexOf(entry['title']) != -1); - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".containedIn()"); - assert.end(); + test("ContentType title should exist", () => { + expect(entries[1].title).toBeDefined(); }); -}); -test('.notContainedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["source1", "source2"]; - - Query - .notContainedIn('title', _in) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(entries[0].length, 'No Entry present in the resultset'); - assert.ok(entries[0].length, 3, 'three Entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notContainedIn()"); - assert.end(); + test("ContentType uid should match requested content type", () => { + expect(entries[1].uid).toBe(contentTypes.source); }); -}); + test("Count should be present in the resultset", () => { + expect(entries[2]).toBeTruthy(); + }); + }); + }); + + describe("Localization Tests", () => { + describe("find: without fallback", () => { + let entries; + const _in = ["ja-jp"]; + + beforeAll(async () => { + entries = await Stack.ContentType(contentTypes.source) + .Query() + .language("ja-jp") + .toJSON() + .find(); + }); -/*! - *Element(exists) - * !*/ - -test('.exists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "boolean", - field = 'updated_at'; - - Query - .exists(queryField) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".exists()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); -test('.notExists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "isspecial", - field = 'updated_at'; - - Query - .notExists(queryField) - .toJSON() - .find() - .then(function success(entries) { - assert.ok("entries" in entries, 'Entries key present in the resultset'); - //assert.notok(entries[0].length, 'No entry present in the resultset'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); + test("All entries should have the correct locale", () => { + if (entries && entries[0].length) { + const allHaveCorrectLocale = entries[0].every((entry) => + _in.includes(entry.publish_details.locale) + ); + expect(allHaveCorrectLocale).toBe(true); + } + }); + }); + + describe("find: with fallback", () => { + let entries; + const _in = ["ja-jp", "en-us"]; + + beforeAll(async () => { + entries = await Stack.ContentType(contentTypes.source) + .Query() + .language("ja-jp") + .includeFallback() + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have locale from the allowed fallback list", () => { + if (entries && entries[0].length) { + const allHaveCorrectLocale = entries[0].every((entry) => + _in.includes(entry.publish_details.locale) + ); + expect(allHaveCorrectLocale).toBe(true); + } + }); + }); + }); + + describe("Global Field Tests", () => { + describe(".getContentTypes()", () => { + let entries; + + beforeAll(async () => { + entries = await Stack.getContentTypes({ + include_global_field_schema: true, + }); + }); + + test("Global field schema should be present when applicable", () => { + for (var i = 0; i < entries.content_types[0].schema.length; i++) { + if ( + entries.content_types[0].schema[i].data_type === "global_field" + ) { + expect(entries[1]["schema"][i]["schema"]).toBeDefined(); } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".notExists()"); - assert.end(); + } }); -}); + }); + }); + describe("Field Selection Tests", () => { + describe(".only() - Single String Parameter", () => { + let entries; -// Pagination -test('.skip()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - - Query - .toJSON() - .find() - .then(function success(allEntries) { - //assert.equal(Utils.isEntriesPublished(allEntries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - // assert.ok("entries" in allEntries, 'Entries key present in the resultset'); - Stack - .ContentType(contentTypes.source) - .Query() - .skip(1) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok((entries[0].length >= 2), '2 or more Entries present in the resultset'); - assert.deepEqual(allEntries[0].slice(1), entries[0], 'All elements matched.'); - if (entries && entries.length && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".skip()"); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail(".skip()"); - assert.end(); + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.only("title").toJSON().find(); }); -}); -test('.limit()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - - Query - .toJSON() - .find() - .then(function success(allEntries) { - //assert.equal(Utils.isEntriesPublished(allEntries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - // assert.ok("entries" in allEntries, 'Entries key present in the resultset'); - Stack - .ContentType(contentTypes.source) - .Query() - .limit(2) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.deepEqual(allEntries[0].slice(0, 2), entries[0], 'All elements matched.'); - if (entries && entries.length && entries[0] && entries[0].length) { - var prev = entries[0][0][field]; - var _entries = entries[0].every(function(entry) { - var flag = (entry[field] <= prev); - prev = entry[field]; - return flag; - }); - assert.equal(_entries, true, "entries sorted descending on '" + field + "' field"); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); - }); - }, function error(err) { - console.error("error :", err); - assert.fail(".limit()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); -test('.count()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .count() - .toJSON() - .find() - .then(function success(count) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.ok(count, 'Entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".count()"); - assert.end(); + test("All entries should contain only title and uid fields", () => { + const allHaveCorrectFields = entries[0].every( + (entry) => + Object.keys(entry).length === 2 && + "title" in entry && + "uid" in entry + ); + expect(allHaveCorrectFields).toBe(true); }); -}); + }); + describe(".only() - Multiple String Parameter", () => { + let entries; -// Logical -test('.or() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().where('title', 'source2'); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .or(Query1, Query2) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[0].length, 2, 'two entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (~(entry.title === 'source1' || entry.boolean === true)); - }); - assert.ok(_entries, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".or() - Query Objects"); - assert.end(); + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.only("BASE", "title").toJSON().find(); }); -}); -test('.and() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().where('title', 'source1'); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, '1 Entry present in the resultset'); - if (entries && entries.length && entries[0].length) { - // console.log("\n\n\n\n",JSON.stringify(entries)); - var _entries = entries[0].every(function(entry) { - return (~(entry.title === 'source1' || entry.boolean === true)); - }); - assert.ok(_entries, '$AND condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".and() - Query Objects"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); -// Custom query -test('.query() - Raw query', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .query({ "$or": [{ "title": "source2" }, { "boolean": "true" }] }) - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[0].length, 2, 'two entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (entry.title === 'source2' || entry.boolean === false) - }); - assert.ok(_entries, '$OR condition satisfied'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".query() - Raw query"); - assert.end(); + test("All entries should contain only title and uid fields", () => { + const allHaveCorrectFields = entries[0].every( + (entry) => + Object.keys(entry).length === 2 && + "title" in entry && + "uid" in entry + ); + expect(allHaveCorrectFields).toBe(true); }); -}); + }); + describe(".only() - Array Parameter", () => { + let entries; -// tags -test('.tags()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'tags', - tags = ["tag1", "tag2"]; - - Query - .tags(tags) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - // assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok((entries.length >= 1), '1 or more Entry/Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (Utils.arrayPresentInArray(tags, entry[field])); - }); - assert.equal(_entries, true, 'Tags specified are found in result set'); - } - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".tags()"); - assert.end(); + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.only(["title", "url"]).toJSON().find(); }); -}); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); -// search -test('.search()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - Query - .toJSON() - .search('source2') - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, '1 Entry present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".search()"); - assert.end(); + test("All entries should contain only title, url, and uid fields", () => { + const allHaveCorrectFields = entries[0].every( + (entry) => + Object.keys(entry).length === 3 && + "title" in entry && + "url" in entry && + "uid" in entry + ); + expect(allHaveCorrectFields).toBe(true); + }); + }); + + describe(".only() - For the reference - String", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .only("reference", "title") + .toJSON() + .find(); }); -}); -// regex -test('.regex()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'title', - regex = { - pattern: '^source', - options: 'i' - }, - regexpObj = new RegExp(regex.pattern, regex.options); - - Query - .regex(field, regex.pattern, regex.options) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok((entries.length >= 1), '1 or more Entry/Entries present in the resultset'); - var flag = entries[0].every(function(entry) { - return regexpObj.test(entry[field]); - }); - assert.ok(flag, "regexp satisfied for all the entries in the resultset"); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".regex()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); -// inlcudeEmbeddedItems -test('.inlcudeEmbeddedItems()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeEmbeddedItems() - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".inlcudeEmbeddedItems()"); - assert.end(); + test("All entries should contain reference field", () => { + const allHaveReference = entries[0].every( + (entry) => "reference" in entry + ); + expect(allHaveReference).toBe(true); + }); + }); + + describe(".only() - For the reference - Array", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .only("reference", ["title"]) + .toJSON() + .find(); }); -}); -test('find: without fallback', function(assert) { - var _in = ['ja-jp'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .toJSON() - .find() - .then((entries) => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (_in.indexOf(entry['publish_details']['locale']) != -1); - }); - assert.equal(_entries, true, "Publish content fallback"); - } - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -test('find: fallback', function(assert) { - var _in = ['ja-jp', 'en-us'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .includeFallback() - .toJSON() - .find() - .then((entries) => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - if (entries && entries.length && entries[0].length) { - var _entries = entries[0].every(function(entry) { - return (_in.indexOf(entry['publish_details']['locale']) != -1); - }); - assert.equal(_entries, true, "Publish content fallback"); - } - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -// includeContentType -test('.includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeContentType() - .toJSON() - .find() - .then(function success(entries) { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1]['schema'], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - for(var i=0; i { + expect(entries[0].length).toBeTruthy(); }); -}); -test('.getContentTypes()', function(assert) { - var Query = Stack.getContentTypes({"include_global_field_schema": true}) - Query - .then(function success(entries) { - for(var i=0; i { + const allHaveReference = entries[0].every( + (entry) => "reference" in entry + ); + expect(allHaveReference).toBe(true); }); -}); + }); + }); + + describe("Field Exclusion Tests", () => { + describe(".except() - Single String Parameter", () => { + let entries; -// includeReference -test('.includeReference() - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .toJSON() - .find() - .then(function success(entries) { - var flag = entries[0].every(function(entry) { - return (entry && entry.reference && typeof entry.reference === 'object'); - }); - assert.equal(flag, true, 'all the present reference are included'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeReference() - String"); - assert.end(); + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.except("title").toJSON().find(); }); -}); -test('.includeReference() - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference(['reference', 'other_reference']) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - var flag = entries[0].every(function(entry) { - return (entry && entry.reference && typeof entry.reference === 'object' && entry.other_reference && typeof entry.other_reference === 'object'); - }); - assert.equal(flag, true, 'all the present reference are included'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeReference() - Array"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); -// includeCount -test('.includeCount()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeCount() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeCount()"); - assert.end(); + test("All entries should not have title field", () => { + const allExcluded = entries[0].every( + (entry) => entry && !("title" in entry) + ); + expect(allExcluded).toBe(true); }); -}); + }); -// includeSchema -test('.includeSchema()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'Schema present in the resultset'); - for(var i=0; i { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.except("BASE", "title").toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should not have title field", () => { + const allExcluded = entries[0].every( + (entry) => entry && !("title" in entry) + ); + expect(allExcluded).toBe(true); + }); + }); + + describe(".except() - Array of String Parameter", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.except(["title", "file"]).toJSON().find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should not have title and file fields", () => { + const allExcluded = entries[0].every( + (entry) => entry && !("title" in entry) && !("file" in entry) + ); + expect(allExcluded).toBe(true); + }); + }); + + describe(".except() - For the reference - String", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .except("reference", "title") + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have reference field", () => { + const allHaveReference = entries[0].every( + (entry) => entry && "reference" in entry + ); + expect(allHaveReference).toBe(true); + }); + + test("All entries should have uid field", () => { + const allHaveUID = entries[0].every( + (entry) => entry && "uid" in entry + ); + expect(allHaveUID).toBe(true); }); -}); -// includeReferenceContenttypeUid with an object -test('.includeReferenceContenttypeUid()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .includeReferenceContentTypeUID() - .toJSON() - .find() - .then(function success(entries) { - for(var i=0; i { + let allReferencesExcluded = true; + + entries[0].forEach((entry) => { + if ( + entry && + entry.reference && + typeof entry.reference === "object" + ) { + entry.reference.forEach((reference) => { + if (reference && "title" in reference) { + allReferencesExcluded = false; } + }); } - }, function error(err) { - console.error("error :", err); - assert.fail(".includeSchema()"); - assert.end(); + }); + + expect(allReferencesExcluded).toBe(true); + }); + }); + + describe(".except() - For the reference - Array", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entries = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .except("reference", ["title"]) + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + + test("All entries should have reference field", () => { + const allHaveReference = entries[0].every( + (entry) => entry && "reference" in entry + ); + expect(allHaveReference).toBe(true); }); -}); + test("All entries should have uid field", () => { + const allHaveUID = entries[0].every( + (entry) => entry && "uid" in entry + ); + expect(allHaveUID).toBe(true); + }); -// includeReferenceContenttypeUid with string -test('.includeReferenceContenttypeUid()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .includeReferenceContentTypeUID() - .toJSON() - .find() - .then(function success(entries) { - for(var i=0; i { + let allReferencesExcluded = true; + + entries[0].forEach((entry) => { + if ( + entry && + entry.reference && + typeof entry.reference === "object" + ) { + entry.reference.forEach((reference) => { + if (reference && "title" in reference) { + allReferencesExcluded = false; } + }); } - }, function error(err) { - console.error("error :", err); - assert.fail(".includeReferenceContenttypeUid()"); - assert.end(); + }); + + expect(allReferencesExcluded).toBe(true); + }); + }); + }); + + describe("Taxonomies Endpoint Tests", () => { + describe("Get Entries With One Term", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.Taxonomies(); + entries = await Query.where("taxonomies.one", "term_one") + .toJSON() + .find(); }); -}); -// includeCount && includeSchema -test('.includeCount() and .includeSchema()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeCount() - .includeSchema() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1].length, 'Schema present in the resultset'); - assert.ok(entries[2], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeSchema()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + + describe("Get Entries With Any Term ($in)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.Taxonomies(); + entries = await Query.containedIn("taxonomies.one", [ + "term_one", + "term_two", + ]) + .toJSON() + .find(); }); -}); -// includeContentType -test('.includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeContentType() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".includeContentType()"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); + }); -// includeCount && includeContentType -test('.includeCount() and .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeCount() - .includeContentType() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.ok(entries[2], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeCount && includeContentType"); - assert.end(); + describe("Get Entries With Any Term ($or)", () => { + let entries; + + beforeAll(async () => { + const Query1 = Stack.Taxonomies().where("taxonomies.one", "term_one"); + const Query2 = Stack.Taxonomies().where("taxonomies.two", "term_two"); + const Query = Stack.Taxonomies(); + + entries = await Query.or(Query1, Query2).toJSON().find(); }); -}); -// includeSchema && includeContentType -test('.includeSchema() and .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .includeContentType() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeCount && includeContentType"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); + }); -// includeCount, includeSchema && includeContentType -test('.includeSchema() and .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeCount() - .includeSchema() - .includeContentType() - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - //assert.equal(Utils.isEntriesPublished(entries[0], Stack.environment_uid, 'en-us'), true, "Entries present in the resultset are published."); - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.ok(entries[1], 'ContentType present in the resultset'); - assert.ok(entries[1]['title'], 'ContentType title exists'); - assert.ok((entries[1]['uid'] === contentTypes.source), 'ContentType uid is same as requested'); - assert.ok(entries[2], 'Count present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(".includeCount && includeContentType"); - assert.end(); + describe("Get Entries With All Terms ($and)", () => { + let entries; + + beforeAll(async () => { + const Query1 = Stack.Taxonomies().where("taxonomies.one", "term_one"); + const Query2 = Stack.Taxonomies().where("taxonomies.two", "term_two"); + const Query = Stack.Taxonomies(); + + entries = await Query.and(Query1, Query2).toJSON().find(); }); -}); -// only -test('.only() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only('title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - Single String Parameter"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); + }); + + describe("Get Entries With Any Taxonomy Terms ($exists)", () => { + let entries; -test('.only() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only('BASE', 'title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - Multiple String Parameter"); - assert.end(); + beforeAll(async () => { + const Query = Stack.Taxonomies(); + entries = await Query.exists("taxonomies.one").toJSON().find(); }); -}); -test('.only() - Array Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only(['title', 'url']) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && Object.keys(entry).length === 3 && "title" in entry && "url" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field title,url in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - Array Parameter"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + }); + + describe("Content Type Taxonomies Query Tests", () => { + describe("Get Entries With One Term", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.where("taxonomies.one", "term_one") + .toJSON() + .find(); }); -}); -test('.only() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .only('reference', 'title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - For the reference - String"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + + describe("Get Entries With Any Term ($in)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.containedIn("taxonomies.one", [ + "term_one", + "term_two", + ]) + .toJSON() + .find(); }); -}); -test('.only() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .only('reference', ['title']) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".only() - For the reference - Array"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); + }); + + describe("Get Entries With Any Term ($or)", () => { + let entries; -// except -test('.except() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && !("title" in entry)); - }); - assert.ok(flag, 'entries without the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".except() - Single String Parameter"); - assert.end(); + beforeAll(async () => { + const Query1 = Stack.ContentType("source") + .Query() + .where("taxonomies.one", "term_one"); + const Query2 = Stack.ContentType("source") + .Query() + .where("taxonomies.two", "term_two"); + const Query = Stack.ContentType("source").Query(); + + entries = await Query.or(Query1, Query2).toJSON().find(); }); -}); -test('.except() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('BASE', 'title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && !("title" in entry)); - }); - assert.ok(flag, 'entries without the field title, url in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".except() - Multiple String Parameter"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); + }); + + describe("Get Entries With All Terms ($and)", () => { + let entries; -test('.except() - Array of String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except(['title', 'file']) - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - return (entry && !("title" in entry) && !("file" in entry)); - }); - assert.ok(flag, 'entries without the field title, file in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".except() - Array of String Parameter"); - assert.end(); + beforeAll(async () => { + const Query1 = Stack.ContentType("source") + .Query() + .where("taxonomies.one", "term_one"); + const Query2 = Stack.ContentType("source") + .Query() + .where("taxonomies.two", "term_two"); + const Query = Stack.ContentType("source").Query(); + + entries = await Query.and(Query1, Query2).toJSON().find(); }); -}); -test('.except() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .except('reference', 'title') - .toJSON() - .find() - .then(function success(entries) { - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - var _flag; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - _flag = true; - _flag = entry.reference.every(function(reference) { - return (reference && !("title" in reference)); - }); - } else { - _flag = true; - } - return (_flag && entry && (Object.keys(entry).length === 3 || Object.keys(entry).length === 2) && "reference" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".except() - For the reference - String"); - assert.end(); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); }); -}); + }); -test('.except() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .except('reference', ['title']) - .toJSON() - .find() - .then(function success(entries) { - - // assert.ok("entries" in result, 'Entries key present in the resultset'); - var flag = entries[0].every(function(entry) { - var _flag; - - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - _flag = true; - _flag = entry.reference.every(function(reference) { - return (reference && !("title" in reference)); - }); - } else { - _flag = true; - } - return (_flag && entry && (Object.keys(entry).length === 3 || Object.keys(entry).length === 2) && "reference" in entry && "uid" in entry); - }); - assert.ok(flag, 'entries with the field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail(".except() - For the reference - Array"); - assert.end(); + describe("Get Entries With Any Taxonomy Terms ($exists)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.exists("taxonomies.one").toJSON().find(); }); -}); -// Taxonomies Endpoint -test('Taxonomies Endpoint: Get Entries With One Term', function(assert) { - let Query = Stack.Taxonomies(); - Query - .where('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With One Term"); - assert.end(); - }) -}); + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); -test('Taxonomies Endpoint: Get Entries With Any Term ($in)', function(assert) { - let Query = Stack.Taxonomies(); - Query - .containedIn('taxonomies.one', ['term_one', 'term_two']) - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With Any Term ($in)"); - assert.end(); - }) -}) - -test('Taxonomies Endpoint: Get Entries With Any Term ($or)', function(assert) { - let Query = Stack.Taxonomies(); - let Query1 = Stack.Taxonomies().where('taxonomies.one', 'term_one'); - let Query2 = Stack.Taxonomies().where('taxonomies.two', 'term_two'); - Query - .or(Query1, Query2) - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With Any Term ($or)"); - assert.end(); - }) -}) - -test('Taxonomies Endpoint: Get Entries With All Terms ($and)', function(assert) { - let Query1 = Stack.Taxonomies().where('taxonomies.one', 'term_one'); - let Query2 = Stack.Taxonomies().where('taxonomies.two', 'term_two'); - let Query = Stack.Taxonomies(); - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With All Terms ($and)"); - assert.end(); - }) -}) - -test('Taxonomies Endpoint: Get Entries With Any Taxonomy Terms ($exists)', function(assert) { - let Query = Stack.Taxonomies(); - Query - .exists('taxonomies.one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With Any Taxonomy Terms ($exists)"); - assert.end(); - }) -}) - -test('Taxonomies Endpoint: Get Entries With Taxonomy Terms and Also Matching Its Children Term ($eq_below, level)', function(assert) { - let Query = Stack.Taxonomies(); - Query - .equalAndBelow('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With Taxonomy Terms and Also Matching Its Children Term ($eq_below, level)"); - assert.end(); - }) -}) - -test('Taxonomies Endpoint: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level)', function(assert) { - let Query = Stack.Taxonomies(); - Query - .below('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level)"); - assert.end(); - }) -}) - -test('Taxonomies Endpoint: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)', function(assert) { - let Query = Stack.Taxonomies(); - Query - .equalAndAbove('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)"); - assert.end(); - }) -}) - -test('Taxonomies Endpoint: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)', function(assert) { - let Query = Stack.Taxonomies(); - Query - .above('taxonomies.one', 'term_one_child') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Taxonomies Endpoint: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)"); - assert.end(); - }) -}) - -//Content Type end point -test('CT Taxonomies Query: Get Entries With One Term', function(assert) { - let Query = Stack.ContentType('source').Query(); - Query - .where('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With One Term"); - assert.end(); - }) -}); + describe("Get Entries With Taxonomy Terms and Also Matching Its Children Term ($eq_below, level)", () => { + let entries; -test('CT Taxonomies Query: Get Entries With Any Term ($in)', function(assert) { - let Query = Stack.ContentType('source').Query(); - Query - .containedIn('taxonomies.one', ['term_one', 'term_two']) - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With Any Term ($in)"); - assert.end(); - }) -}) - -test('CT Taxonomies Query: Get Entries With Any Term ($or)', function(assert) { - let Query = Stack.ContentType('source').Query(); - let Query1 = Stack.ContentType('source').Query().where('taxonomies.one', 'term_one'); - let Query2 = Stack.ContentType('source').Query().where('taxonomies.two', 'term_two'); - Query - .or(Query1, Query2) - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With Any Term ($or)"); - assert.end(); - }) -}) - -test('CT Taxonomies Query: Get Entries With All Terms ($and)', function(assert) { - let Query1 = Stack.ContentType('source').Query().where('taxonomies.one', 'term_one'); - let Query2 = Stack.ContentType('source').Query().where('taxonomies.two', 'term_two'); - let Query = Stack.ContentType('source').Query(); - Query - .and(Query1, Query2) - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With All Terms ($and)"); - assert.end(); - }) -}) - -test('CT Taxonomies Query: Get Entries With Any Taxonomy Terms ($exists)', function(assert) { - let Query = Stack.ContentType('source').Query(); - Query - .exists('taxonomies.one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With Any Taxonomy Terms ($exists)"); - assert.end(); - }) -}) - -test('CT Taxonomies Query: Get Entries With Taxonomy Terms and Also Matching Its Children Term ($eq_below, level)', function(assert) { - let Query = Stack.ContentType('source').Query(); - Query - .equalAndBelow('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With Taxonomy Terms and Also Matching Its Children Term ($eq_below, level)"); - assert.end(); - }) -}) - -test('CT Taxonomies Query: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level)', function(assert) { - let Query = Stack.ContentType('source').Query(); - Query - .below('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With Taxonomy Terms Children\'s and Excluding the term itself ($below, level)"); - assert.end(); - }) -}) - -test('CT Taxonomies Query: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)', function(assert) { - let Query = Stack.ContentType('source').Query(); - Query - .equalAndAbove('taxonomies.one', 'term_one') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)"); - assert.end(); - }) -}) - -test('CT Taxonomies Query: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)', function(assert) { - let Query = Stack.ContentType('source').Query(); - Query - .above('taxonomies.one', 'term_one_child') - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("CT Taxonomies Query: Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)"); - assert.end(); - }) -}) -test('Variants in entry', function (assert) { - let Query = Stack.ContentType('source').Query(); - Query - .variants(['variant_entry_1', 'variant_entry_2']) - .toJSON() - .find() - .then(entries => { - assert.ok(entries[0].length, 'Variant entries present in the resultset'); - assert.end(); - }, err => { - console.error("error :", err); - assert.fail("Variant Entries are not present in the CT"); - assert.end(); - }) -}); \ No newline at end of file + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.equalAndBelow("taxonomies.one", "term_one") + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + + describe("Get Entries With Taxonomy Terms Children's and Excluding the term itself ($below, level)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.below("taxonomies.one", "term_one") + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + + describe("Get Entries With Taxonomy Terms and Also Matching Its Parent Term ($eq_above, level)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.equalAndAbove("taxonomies.one", "term_one") + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + + describe("Get Entries With Taxonomy Terms Parent and Excluding the term itself ($above, level)", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.above("taxonomies.one", "term_one_child") + .toJSON() + .find(); + }); + + test("Should return entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + }); + describe("Variants Tests", () => { + describe("Variants in entry", () => { + let entries; + + beforeAll(async () => { + const Query = Stack.ContentType("source").Query(); + entries = await Query.variants(["variant_entry_1", "variant_entry_2"]) + .toJSON() + .find(); + }); + + test("Should return variant entries in the resultset", () => { + expect(entries[0].length).toBeTruthy(); + }); + }); + }); + }); +}); diff --git a/test/entry/findone-result-wrapper.js b/test/entry/findone-result-wrapper.js index 1ff2171a..af8e7774 100755 --- a/test/entry/findone-result-wrapper.js +++ b/test/entry/findone-result-wrapper.js @@ -1,778 +1,930 @@ -'use strict'; +"use strict"; /* * Module Dependencies. */ -const test = require('tape'); -const Contentstack = require('../../dist/node/contentstack.js'); -const Utils = require('./utils.js'); -const init = require('../config.js'); +const Contentstack = require("../../dist/node/contentstack.js"); +const Utils = require("./utils.js"); +const init = require("../config.js"); const contentTypes = init.contentTypes; let Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); - -test('findOne: default .findOne()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - Query - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: default .findOne()"); - assert.end(); - }); -}); - -/*! - * SORTING - * !*/ -test('findOne: .ascending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - - Query - .ascending(field) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .ascending()"); - assert.end(); - }); -}); - -test('findOne: .descending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'created_at'; - - Query - .descending(field) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .descending()"); - assert.end(); - }); -}); - - -/*! - * COMPARISION - * !*/ -test('findOne: .lessThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - Query - .lessThan(field, value) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] < value), 'Entry num_field having value less than ' + value + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .lessThan()"); - assert.end(); - }); -}); - -test('findOne: .lessThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - Query - .lessThanOrEqualTo(field, value) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] <= value), 'Entry num_field having value less than or equal to ' + value + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .lessThanOrEqualTo()"); - assert.end(); - }); -}); - -test('findOne: .greaterThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 6; - - Query - .greaterThan(field, value) - .ascending(field) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] > value), 'Entry num_field having value greater than ' + value + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .greaterThan()"); - assert.end(); - }); -}); - -test('findOne: .greaterThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - - Query - .greaterThanOrEqualTo(field, value) - .descending(field) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] >= value), 'Entry num_field having value greater than ' + value + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .greaterThanOrEqualTo()"); - assert.end(); - }); -}); - -test('findOne: .notEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 6; - - Query - .notEqualTo(field, value) - .descending(field) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] !== value), 'Entry num_field having value is not equal to ' + value + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .notEqualTo()"); - assert.end(); - }); -}); - - -/*! - * Array/Subset - * !*/ - -test('findOne: .containedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["source1", "source2"]; - - Query - .containedIn('title', _in) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry['title'] && ~_in.indexOf(entry['title'])), 'Entry title exists from the available options ' + _in.join(', ') + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .containedIn()"); - assert.end(); - }); -}); - -test('findOne: .notContainedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["source1"]; - - Query - .notContainedIn('title', _in) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry['title'] && _in.indexOf(entry['title']) === -1), 'Entry title not exists from the available options ' + _in.join(', ') + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("findOne: .notContainedIn() :", err); - assert.deepEqual(err, { error_code: 141, error_message: 'The requested entry doesn\'t exist.' }, "No entry found"); - assert.end(); - }); -}); - - -/*! - *Element(exists) - * !*/ - -test('findOne: .exists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "boolean"; - - Query - .exists(queryField) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && typeof entry[queryField] !== 'undefined'), 'Entry having the ' + queryField + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .exists()"); - assert.end(); - }); -}); - -test('findOne: .notExists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "isspecial"; - - Query - .notExists(queryField) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && typeof entry[queryField] === 'undefined'), 'Entry having the ' + queryField + '.'); - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("findOne: .notExists():", err); - assert.deepEqual(err, { error_code: 141, error_message: 'The requested entry doesn\'t exist.' }, "No entry found"); - assert.end(); - }); -}); - - -// Pagination -test('findOne: .skip()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .toJSON() - .find() - .then(function success(allEntries) { - assert.ok(allEntries.length, 'entry key present in the resultset'); - Stack - .ContentType(contentTypes.source) - .Query() - .skip(1) - .toJSON() - .findOne() - .then(function result(entry) { - assert.deepEqual(allEntries[0][1], entry, 'Element matched.'); - assert.end(); - }, function error(err) { - console.error("error :", err); - assert.fail("findOne: .skip()"); - assert.end(); - }); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .skip()"); - assert.end(); - }); -}); - - - -// Logical -test('findOne: .or() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().containedIn('title', ['source1']); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', 'false'); - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .or(Query1, Query2) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok((entry && entry['uid'] && entry['locale'] && entry['publish_details']), 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .or() - Query Objects"); - assert.end(); - }); -}); - -test('findOne: .and() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().containedIn('title', ['source1']); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .and(Query1, Query2) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok(entry && entry.uid && entry.locale && entry.publish_details, 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .and() - Query Objects"); - assert.end(); - }); -}); - - - -// Custom query -test('findOne: .query() - Raw query', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .query({ "$or": [{ "title": "source1" }, { "boolean": "false" }] }) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok(entry && entry.uid && entry.locale && entry.publish_details, 'Entry should have uid, publish_details, locale.'); - assert.ok(~(entry.title === 'source1' || entry.boolean === true), '$OR condition satisfied'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .query() - Raw query"); - assert.end(); - }); -}); - - -// tags -test('findOne: .tags()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - tags = ["tag1", "tag2"]; - - Query - .tags(tags) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok(entry && entry.uid && entry.locale && entry.publish_details, 'Entry should have uid, publish_details, locale.'); - assert.equal((Utils.arrayPresentInArray(tags, entry.tags) > 0), true, 'Tags specified are found in result set'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .tags()"); - assert.end(); - }); -}); - - -// search -test('findOne: .search()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .search('source1') - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok(entry && entry.uid && entry.locale && entry.publish_details, 'Entry should have uid, publish_details, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .search()"); - assert.end(); - }); -}); - - -// search -test('findOne: .regex()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'title', - regex = { - pattern: '^source', - options: 'i' - }; - - Query - .regex(field, regex.pattern, regex.options) - .toJSON() - .findOne() - .then(function success(entry) { - assert.ok(entry && entry.uid && entry.locale && entry.publish_details, 'Entry should have uid, publish_details, locale.'); - assert.ok((new RegExp(regex.pattern, regex.options).test(entry[field])), "regexp satisfied"); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .regex()"); - assert.end(); - }); -}); - - -test('findOne: without fallback', function(assert) { - var _in = ['ja-jp'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .toJSON() - .findOne() - .then((entry) => { - var _entries = (_in.indexOf(entry['publish_details']['locale']) != -1); - assert.equal(_entries, true, "Publish content fallback"); - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -test('findOne: fallback', function(assert) { - var _in = ['ja-jp', 'en-us'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .includeFallback() - .toJSON() - .findOne() - .then((entry) => { - var _entries = (_in.indexOf(entry['publish_details']['locale']) != -1); - assert.equal(_entries, true, "Publish content fallback"); - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -// includeReference -test('findOne: .includeReference() - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .toJSON() - .findOne() - .then(function success(entry) { - assert.equal((entry && entry['reference'] && typeof entry['reference'] === 'object'), true, 'all the present reference are included'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeReference() - String"); - assert.end(); - }); -}); - -test('findOne: .includeReference() - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference(['reference', 'other_reference']) - .toJSON() - .findOne() - .then(function success(entry) { - assert.equal((entry && entry.reference && typeof entry.reference === 'object' && entry.other_reference && typeof entry.other_reference === 'object'), true, 'all the present reference and other reference are included'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeReference() - Array"); - assert.end(); - }); -}); - - -// includeSchema -test('findOne: .includeSchema()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .toJSON() - .findOne() - .then(function success(entry, schema) { - // console.log("result : ", Object.keys(result || {})); - assert.ok(entry, 'entry present in the resultset'); - //assert.ok(schema, 'Schema is not present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeSchema()"); - assert.end(); - }); -}); - -// includeContentType -test('findOne: .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeContentType() - .toJSON() - .findOne() - .then(function success(entry, contentType) { - // console.log("result : ", entry, contentType); - assert.ok(entry, 'entry present in the resultset'); - assert.ok((typeof contentType === "undefined"), 'ContentType is not present.'); - // assert.ok((contentType.uid === "source"), 'ContentType is title matched.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeContentType()"); - assert.end(); - }); -}); - -// includeSchema & includeContentType -test('findOne: includeSchema & .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .includeContentType() - .toJSON() - .findOne() - .then(function success(entry, contentType) { - // console.log("result : ", entry, contentType); - assert.ok(entry, 'entry present in the resultset'); - assert.ok((typeof contentType === "undefined"), 'ContentType is not present.'); - // assert.ok((contentType.uid === "source"), 'ContentType is title matched.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: includeSchema & .includeContentType()"); - assert.end(); - }); -}); - -// only -test('findOne: .only() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only('title') - .toJSON() - .findOne() - .then(function success(entry) { - var flag = (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - assert.ok(flag, 'entry with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - Single String Parameter"); - assert.end(); - }); -}); - -test('findOne: .only() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only('BASE', 'title') - .toJSON() - .findOne() - .then(function success(entry) { - var flag = (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - assert.ok(flag, 'entry with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - Multiple String Parameter"); - assert.end(); - }); -}); - -test('findOne: .only() - Array Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only(['title', 'url']) - .toJSON() - .findOne() - .then(function success(entry) { - var flag = (entry && Object.keys(entry).length === 3 && "title" in entry && "uid" in entry && "url" in entry); - assert.ok(flag, 'entry with the field title,url in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - Array Parameter"); - assert.end(); - }); -}); - -test('findOne: .only() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - Query - .includeReference('reference') - .only('BASE', 'reference') - .only('reference', 'title') - .toJSON() - .findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - flag = entry['reference'].every(function(reference) { - return (reference && "title" in reference && "uid" in reference); - }); +describe("FindOne Tests", () => { + // Setup - Initialize the Contentstack Stack Instance + beforeAll((done) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(done, 1000); + }); + + describe("Default FindOne", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.toJSON().findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + // SORTING TESTS + describe("Sorting", () => { + describe("Ascending", () => { + let entry; + let error = null; + const field = "updated_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.ascending(field).toJSON().findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("Descending", () => { + let entry; + const field = "created_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.descending(field).toJSON().findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + }); + + // COMPARISON TESTS + describe("Comparison", () => { + describe("lessThan", () => { + let entry; + let error = null; + const field = "num_field"; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entry = await Query.lessThan(field, value).toJSON().findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + + test("num_field should be less than specified value", () => { + expect(entry[field]).toBeLessThan(value); + }); + }); + + describe("lessThanOrEqualTo", () => { + let entry; + let error = null; + const field = "num_field"; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entry = await Query.lessThanOrEqualTo(field, value).toJSON().findOne(); + }); + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + test("num_field should be less than or equal to specified value", () => { + expect(entry[field]).toBeLessThanOrEqual(value); + }); + }); + + describe("greaterThan", () => { + let entry; + let error = null; + const field = "num_field"; + const value = 6; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entry = await Query.greaterThan(field, value) + .ascending(field) + .toJSON() + .findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + + test("num_field should be greater than specified value", () => { + expect(entry[field]).toBeGreaterThan(value); + }); + }); + + describe("greaterThanOrEqualTo", () => { + let entry; + let error = null; + const field = "num_field"; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entry = await Query.greaterThanOrEqualTo(field, value) + .descending(field) + .toJSON() + .findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + + test("num_field should be greater than or equal to specified value", () => { + expect(entry[field]).toBeGreaterThanOrEqual(value); + }); + }); + + describe("notEqualTo", () => { + let entry; + let error = null; + const field = "num_field"; + const value = 6; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entry = await Query.notEqualTo(field, value) + .descending(field) + .toJSON() + .findOne(); + }); + + test("num_field should not be equal to specified value", () => { + expect(entry[field]).not.toBe(value); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + }); + + // ARRAY/SUBSET TESTS + describe("Array/Subset", () => { + describe("containedIn", () => { + let entry; + let error = null; + const _in = ["source1", "source2"]; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.containedIn("title", _in).toJSON().findOne(); + }); + + test("Entry title should be in the specified values", () => { + expect(_in).toContain(entry.title); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("notContainedIn", () => { + let entry; + let error = null; + const _in = ["source1"]; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.notContainedIn("title", _in).toJSON().findOne(); + }); + + test("Should either return an entry with matching criteria or an expected error", () => { + if (entry) { + expect(entry.title).toBeDefined(); + expect(_in).not.toContain(entry.title); + } else { + expect(error).toEqual({ + error_code: 141, + error_message: "The requested entry doesn't exist.", + }); + } + }); + + test("If entry exists, it should have uid", () => { + if (entry) { + expect(entry.uid).toBeDefined(); + } + }); + + test("If entry exists, it should have locale", () => { + if (entry) { + expect(entry.locale).toBeDefined(); + } + }); + + test("If entry exists, it should have publish_details", () => { + if (entry) { + expect(entry.publish_details).toBeDefined(); + } + }); + }); + }); + + // ELEMENT EXISTS TESTS + describe("Element Existence", () => { + describe("exists", () => { + let entry; + let error = null; + const queryField = "boolean"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.exists(queryField).toJSON().findOne(); + }); + + test("Entry should have the queried field", () => { + expect(typeof entry[queryField]).not.toBe("undefined"); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("notExists", () => { + let entry; + let error = null; + const queryField = "isspecial"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.notExists(queryField).toJSON().findOne(); + }); + + test("Should handle either success or error case", () => { + if (entry) { + expect(typeof entry[queryField]).toBe("undefined"); + } else { + expect(error).toEqual({ + error_code: 141, + error_message: "The requested entry doesn't exist.", + }); + } + }); + + test("If entry exists, it should have uid", () => { + if (entry) { + expect(entry.uid).toBeDefined(); + } + }); + + test("If entry exists, it should have locale", () => { + if (entry) { + expect(entry.locale).toBeDefined(); + } + }); + + test("If entry exists, it should have publish_details", () => { + if (entry) { + expect(entry.publish_details).toBeDefined(); + } + }); + }); + }); + describe("Pagination", () => { + describe("skip", () => { + let allEntries; + let skippedEntry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + allEntries = await Query.toJSON().find(); + + const skipQuery = Stack.ContentType(contentTypes.source).Query(); + skippedEntry = await skipQuery.skip(1).toJSON().findOne(); + }); + + test("Should have entries in the result set", () => { + expect(allEntries.length).toBeTruthy(); + }); + + test("Should get correct skipped entry", () => { + expect(skippedEntry).toEqual(allEntries[0][1]); + }); + }); + }); + + describe("Logical Operations", () => { + describe("OR Query Objects", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .containedIn("title", ["source1"]); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", "false"); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entry = await Query.or(Query1, Query2).toJSON().findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("AND Query Objects", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .containedIn("title", ["source1"]); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", true); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entry = await Query.and(Query1, Query2).toJSON().findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("Raw Query", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.query({ + $or: [{ title: "source1" }, { boolean: "false" }], + }) + .toJSON() + .findOne(); + }); + + test("Entry should satisfy OR condition", () => { + expect( + entry.title === "source1" || entry.boolean === false + ).toBeTruthy(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + }); + + describe("Tags", () => { + let entry; + let error = null; + const tags = ["tag1", "tag2"]; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.tags(tags).toJSON().findOne(); + }); + + test("Tags specified should be found in the result", () => { + expect(Utils.arrayPresentInArray(tags, entry.tags) > 0).toBe(true); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("Search", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.search("source1").toJSON().findOne(); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("Regex", () => { + let entry; + let error = null; + const field = "title"; + const regex = { + pattern: "^source", + options: "i", + }; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.regex(field, regex.pattern, regex.options) + .toJSON() + .findOne(); + }); + + test("Entry field should match the regex pattern", () => { + const regExp = new RegExp(regex.pattern, regex.options); + expect(regExp.test(entry[field])).toBe(true); + }); + + test("Should return an entry with uid, locale, publish_details", () => { + expect(entry).toBeDefined(); + expect(entry["uid"]).toBeDefined(); + expect(entry["locale"]).toBeDefined(); + expect(entry["publish_details"]).toBeDefined(); + }); + }); + + describe("Localization", () => { + describe("Without Fallback", () => { + let entry; + let error = null; + const _in = ["ja-jp"]; + + beforeAll(async () => { + entry = await Stack.ContentType(contentTypes.source) + .Query() + .language("ja-jp") + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have correct locale in publish_details", () => { + expect(_in).toContain(entry.publish_details.locale); + }); + }); + + describe("With Fallback", () => { + let entry; + let error = null; + const _in = ["ja-jp", "en-us"]; + + beforeAll(async () => { + entry = await Stack.ContentType(contentTypes.source) + .Query() + .language("ja-jp") + .includeFallback() + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have locale from allowed fallback list", () => { + expect(_in).toContain(entry.publish_details.locale); + }); + }); + }); + describe("Including References", () => { + describe("includeReference - String", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("All present references should be included as objects", () => { + expect( + entry && entry["reference"] && typeof entry["reference"] === "object" + ).toBe(true); + }); + }); + + describe("includeReference - Array", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference(["reference", "other_reference"]) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("All present references should be included as objects", () => { + const condition = + entry && + entry["reference"] && + typeof entry["reference"] === "object" && + entry.other_reference && + typeof entry.other_reference === "object"; + expect(condition).toBe(true); + }); + }); + }); + + describe("Including Schema", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeSchema().toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + }); + + describe("Including ContentType", () => { + let entry; + let contentType; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + [entry, contentType] = await new Promise((resolve, reject) => { + Query.includeContentType() + .toJSON() + .findOne() + .then((entry, contentType) => resolve([entry, contentType]), reject); + }); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("ContentType should not be present", () => { + expect(typeof contentType).toBe("undefined"); + }); + }); + + describe("Including Schema and ContentType", () => { + let entry; + let contentType; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + [entry, contentType] = await new Promise((resolve, reject) => { + Query.includeSchema() + .includeContentType() + .toJSON() + .findOne() + .then((entry, contentType) => resolve([entry, contentType]), reject); + }); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("ContentType should not be present", () => { + expect(typeof contentType).toBe("undefined"); + }); + }); + + describe("Field Selection - Only", () => { + describe("only - Single String Parameter", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.only("title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should only contain title and uid fields", () => { + expect(Object.keys(entry).length).toBe(2); + expect(entry).toHaveProperty("title"); + expect(entry).toHaveProperty("uid"); + }); + }); + + describe("only - Multiple String Parameters", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.only("BASE", "title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should only contain title and uid fields", () => { + expect(Object.keys(entry).length).toBe(2); + expect(entry).toHaveProperty("title"); + expect(entry).toHaveProperty("uid"); + }); + }); + + describe("only - Array Parameter", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.only(["title", "url"]).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should contain title, url, and uid fields", () => { + expect(Object.keys(entry).length).toBe(3); + expect(entry).toHaveProperty("title"); + expect(entry).toHaveProperty("url"); + expect(entry).toHaveProperty("uid"); + }); + }); + + describe("only - For reference - String", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", "reference") + .only("reference", "title") + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Reference fields should be properly filtered", () => { + let hasProperReferences = false; + if ( + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ) { + hasProperReferences = entry["reference"].every( + (ref) => ref && "title" in ref && "uid" in ref + ); + } else { + hasProperReferences = true; // No references or empty references is valid + } + expect(hasProperReferences).toBe(true); + }); + }); + + describe("only - For reference - Array", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .only("reference", ["title"]) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("References should have only specified fields", () => { + let hasProperReferences = false; + if (entry && entry["reference"]) { + if (Array.isArray(entry["reference"])) { + if (entry["reference"].length === 0) { + hasProperReferences = true; } else { - flag = true - } - assert.equal(flag, true, 'Entry has the reference with only paramteres.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - For the reference - String"); - assert.end(); - }); -}); - -test('findOne: .only() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .only('reference', ['title']) - .toJSON() - .findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference']) { - if (entry['reference'].length) { - if (entry['reference'].length === 0){ - flag = true - } else { - flag = entry['reference'].every(function(reference) { - return (reference && "title" in reference && "uid" in reference); - }); - } - } else { - flag = true - } - } else { - flag = true - } - assert.equal(flag, true, 'Entry do not have the reference with only paramteres.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - For the reference - Array"); - assert.end(); - }); -}); - -// except -test('findOne: .except() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('title') - .toJSON() - .findOne() - .then(function success(entry) { - var flag = (entry && !("title" in entry)); - assert.ok(flag, 'entry without the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - Single String Parameter"); - assert.end(); - }); -}); - -test('findOne: .except() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('BASE', 'title') - .toJSON() - .findOne() - .then(function success(entry) { - var flag = (entry && !("title" in entry)); - assert.ok(flag, 'entry without the field title, url in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - Multiple String Parameter"); - assert.end(); - }); -}); - -test('findOne: .except() - Array of String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except(['title', 'url']) - .toJSON() - .findOne() - .then(function success(entry) { - var flag = (entry && !("title" in entry) && !("url" in entry)); - assert.ok(flag, 'entry without the field title, url in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail(""); - assert.end(); - }); -}); - -test('findOne: .except() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', 'reference') - .except('reference', 'title') - .toJSON() - .findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - flag = entry['reference'].every(function(reference) { - return (reference && !("title" in reference)); - }); + hasProperReferences = entry["reference"].every( + (ref) => ref && "title" in ref && "uid" in ref + ); } - assert.ok(flag, 'entry with the field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - For the reference - String"); - assert.end(); - }); + } else { + hasProperReferences = true; + } + } else { + hasProperReferences = true; + } + expect(hasProperReferences).toBe(true); + }); + }); + }); + + describe("Field Selection - Except", () => { + describe("except - Single String Parameter", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.except("title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should not contain the excluded field", () => { + expect(entry).not.toHaveProperty("title"); + }); + }); + + describe("except - Multiple String Parameters", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.except("BASE", "title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should not contain the excluded field", () => { + expect(entry).not.toHaveProperty("title"); + }); + }); + + describe("except - Array of String Parameters", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.except(["title", "url"]).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should not contain the first excluded field", () => { + expect(entry).not.toHaveProperty("title"); + }); + + test("Entry should not contain the second excluded field", () => { + expect(entry).not.toHaveProperty("url"); + }); + }); + + describe("except - For the reference - String", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", "reference") + .except("reference", "title") + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("References should not contain the excluded field", () => { + let hasProperExclusions = false; + if ( + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ) { + hasProperExclusions = entry["reference"].every( + (ref) => ref && !("title" in ref) + ); + } else { + // No references is valid for this test + hasProperExclusions = true; + } + expect(hasProperExclusions).toBe(true); + }); + }); + + describe("except - For the reference - Array", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .except("reference", ["title"]) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("References should not contain the excluded field", () => { + let hasProperExclusions = false; + if ( + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ) { + hasProperExclusions = entry["reference"].every( + (ref) => ref && !("title" in ref) + ); + } else { + hasProperExclusions = true; + } + expect(hasProperExclusions).toBe(true); + }); + }); + }); }); - -test('findOne: .except() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .except('reference', ['title']) - .toJSON() - .findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - flag = entry['reference'].every(function(reference) { - return (reference && !("title" in reference)); - }); - } - assert.ok(flag, 'entry with the field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - For the reference - Array"); - assert.end(); - }); -}); \ No newline at end of file diff --git a/test/entry/findone.js b/test/entry/findone.js index 130d336e..e63d74be 100755 --- a/test/entry/findone.js +++ b/test/entry/findone.js @@ -1,777 +1,907 @@ -'use strict'; +"use strict"; /* * Module Dependencies. */ -const test = require('tape'); -const Contentstack = require('../../dist/node/contentstack.js'); -const Utils = require('./utils.js'); -const init = require('../config.js'); +const Contentstack = require("../../dist/node/contentstack.js"); +const Utils = require("./utils.js"); +const init = require("../config.js"); const contentTypes = init.contentTypes; let Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); - -test('findOne: default .toJSON().findOne()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - Query - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: default .toJSON().findOne()"); - assert.end(); - }); -}); - -/*! - * SORTING - * !*/ -test('findOne: .ascending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'created_at'; - - Query - .ascending(field) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .ascending()"); - assert.end(); - }); -}); - -test('findOne: .descending()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'created_at'; - - Query - .descending(field) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .descending()"); - assert.end(); - }); -}); - - -/*! - * COMPARISION - * !*/ -test('findOne: .lessThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - value = 11; - Query - .lessThan('num_field', value) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.num_field < value), 'Entry num_field having value less than ' + value + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .lessThan()"); - assert.end(); - }); -}); - -test('findOne: .lessThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - value = 11; - Query - .lessThanOrEqualTo('num_field', value) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.num_field <= value), 'Entry num_field having value less than or equal to ' + value + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .lessThanOrEqualTo()"); - assert.end(); - }); -}); - -test('findOne: .greaterThan()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - - Query - .greaterThan('num_field', value) - .ascending(field) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] > value), 'Entry num_field having value greater than ' + value + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .greaterThan()"); - assert.end(); - }); -}); - -test('findOne: .greaterThanOrEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 11; - - Query - .greaterThanOrEqualTo('num_field', value) - .descending(field) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] >= value), 'Entry num_field having value greater than ' + value + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error : ", err); - assert.fail("findOne: .greaterThanOrEqualTo()"); - assert.end(); - }); -}); - -test('findOne: .notEqualTo()', function(assert) { - var Query = Stack.ContentType(contentTypes.numbers_content_type).Query(), - field = 'num_field', - value = 6; - - Query - .notEqualTo('num_field', value) - .descending(field) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry[field] !== value), 'Entry num_field having value is not equal to ' + value + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error : ", err); - assert.fail("findOne: .notEqualTo()"); - assert.end(); - }); -}); - - -/*! - * Array/Subset - * !*/ - -test('findOne: .containedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["source1", "source2"]; - - Query - .containedIn('title', _in) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.title && ~_in.indexOf(entry.title)), 'Entry title exists from the available options ' + _in.join(', ') + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .containedIn()"); - assert.end(); - }); -}); - -test('findOne: .notContainedIn()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - _in = ["source1", "source2", "source3", "source4"]; - - Query - .notContainedIn('title', _in) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.title && _in.indexOf(entry.title) === -1), 'Entry title not exists from the available options ' + _in.join(', ') + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.deepEqual(err, { error_code: 141, error_message: 'The requested entry doesn\'t exist.' }, "No entry found"); - assert.end(); - }); -}); - - -/*! - *Element(exists) - * !*/ - -test('findOne: .exists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "boolean"; - - Query - .exists(queryField) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && typeof entry[queryField] !== 'undefined'), 'Entry having the ' + queryField + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .exists()"); - assert.end(); - }); -}); - -test('findOne: .notExists()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - queryField = "isspecial"; - - Query - .notExists(queryField) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && typeof entry[queryField] === 'undefined'), 'Entry having the ' + queryField + '.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.deepEqual(err, { error_code: 141, error_message: 'The requested entry doesn\'t exist.' }, "No entry found"); - assert.end(); - }); -}); - - -// Pagination -test('findOne: .skip()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .toJSON().find() - .then(function success(allEntries) { - assert.ok(allEntries.length, 'entry key present in the resultset'); - Stack - .ContentType(contentTypes.source) - .Query() - .skip(1) - .toJSON().findOne() - .then(function result(entry) { - assert.deepEqual(allEntries[0][1], entry, 'Element matched.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .skip()"); - assert.end(); - }); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .skip()"); - assert.end(); - }); -}); - -// Logical -test('findOne: .or() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().containedIn('title', ['source1', 'source2']); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .or(Query1, Query2) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && (~(entry.title === 'source1' || entry.boolean === true))), 'Entry satisfies the $OR condition'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .or() - Query Objects"); - assert.end(); - }); -}); - -test('findOne: .and() - Query Objects', function(assert) { - var Query1 = Stack.ContentType(contentTypes.source).Query().where('title', 'source1'); - var Query2 = Stack.ContentType(contentTypes.source).Query().where('boolean', true); - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .and(Query1, Query2) - .toJSON().findOne() - .then(function success(entry) { - assert.ok(~(entry.title === 'source1' && entry.boolean === true), 'Entry satisfies the $AND operation.'); - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .and() - Query Objects"); - assert.end(); - }); -}); - -// Custom query -test('findOne: .query() - Raw query', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .query({ "$or": [{ "title": "source1" }, { "boolean": "false" }] }) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.ok(~(entry.title === 'source1' || entry.boolean === true), '$OR condition satisfied'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .query() - Raw query"); - assert.end(); - }); -}); - - -// tags -test('findOne: .tags()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - tags = ["tag1", "tag2"]; - - Query - .tags(tags) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.equal((Utils.arrayPresentInArray(tags, entry.tags) > 0), true, 'Tags specified are found in result set'); - assert.end(); - }, function error(err) { - console.error("Error :",err); - assert.fail("findOne: .tags()"); - assert.end(); - }); -}); - -//search -test('findOne: .search()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .search('source1') - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .search()"); - assert.end(); - }); -}); - - -// search -test('findOne: .regex()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'title', - regex = { - pattern: '^source', - options: 'i' - }; - - Query - .regex(field, regex.pattern, regex.options) - .toJSON().findOne() - .then(function success(entry) { - assert.ok((entry && entry.uid && entry.locale && entry.publish_details), 'Entry should have publish_details, uid, locale.'); - assert.ok((new RegExp(regex.pattern, regex.options).test(entry[field])), "regexp satisfied"); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .regex()"); - assert.end(); - }); -}); - -test('findOne: without fallback', function(assert) { - var _in = ['ja-jp'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .toJSON() - .findOne() - .then((entry) => { - var _entries = (_in.indexOf(entry['publish_details']['locale']) != -1); - assert.equal(_entries, true, "Publish content fallback"); - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -test('findOne: fallback', function(assert) { - var _in = ['ja-jp', 'en-us'] - Stack.ContentType(contentTypes.source).Query().language('ja-jp') - .toJSON() - .includeFallback() - .findOne() - .then((entry) => { - var _entries = (_in.indexOf(entry['publish_details']['locale']) != -1); - assert.equal(_entries, true, "Publish content fallback"); - assert.end(); - }).catch((error) => { - assert.fail("Entries default .find() fallback catch", error.toString()); - assert.end(); - }) -}) - -// includeReference -test('findOne: .includeReference() - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .toJSON().findOne() - .then(function success(entry) { - assert.equal((entry && entry.reference && typeof entry.reference === 'object'), true, 'all the present reference are included'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeReference() - String"); - assert.end(); - }); -}); - -test('findOne: .includeReference() - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference(['reference', 'other_reference']) - .toJSON().findOne() - .then(function success(entry) { - assert.equal((entry && entry.reference && typeof entry.reference === 'object' && entry.other_reference && typeof entry.other_reference === 'object'), true, 'all the present reference and other reference are included'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeReference() - Array"); - assert.end(); - }); -}); - - -// includeSchema -test('findOne: .includeSchema()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .toJSON() - .findOne() - .then(function success(entry) { - // console.log("result : ", Object.keys(result || {})); - assert.ok(entry, 'Entry present in the resultset'); - //assert.ok(entry.length, 'Schema key present in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeSchema()"); - assert.end(); - }); -}); - -// includeContentType -test('findOne: .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeContentType() - .toJSON() - .findOne() - .then(function success(entry, contentType) { - // console.log("result : ", entry, contentType); - assert.ok(entry, 'entry present in the resultset'); - assert.ok((typeof contentType === "undefined"), 'ContentType is not present.'); - // assert.ok((contentType.uid === "source"), 'ContentType is title matched.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .includeContentType()"); - assert.end(); - }); -}); - -// includeSchema & includeContentType -test('findOne: includeSchema & .includeContentType()', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeSchema() - .includeContentType() - .toJSON() - .findOne() - .then(function success(entry, contentType) { - // console.log("result : ", entry, contentType); - assert.ok(entry, 'entry present in the resultset'); - assert.ok((typeof contentType === "undefined"), 'ContentType is not present.'); - // assert.ok((contentType.uid === "source"), 'ContentType is title matched.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: includeSchema & .includeContentType()"); - assert.end(); - }); -}); - -// only -test('findOne: .only() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only('title') - .toJSON().findOne() - .then(function success(entry) { - var flag = (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - assert.ok(flag, 'entry with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - Single String Parameter"); - assert.end(); - }); -}); - -test('findOne: .only() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only('BASE', 'title') - .toJSON().findOne() - .then(function success(entry) { - var flag = (entry && Object.keys(entry).length === 2 && "title" in entry && "uid" in entry); - assert.ok(flag, 'entry with the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - Multiple String Parameter"); - assert.end(); - }); -}); - -test('findOne: .only() - Array Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .only(['title', 'url']) - .toJSON().findOne() - .then(function success(entry) { - var flag = (entry && Object.keys(entry).length === 3 && "title" in entry && "url" in entry && "uid" in entry); - assert.ok(flag, 'entry with the field title,url in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - Array Parameter"); - assert.end(); - }); -}); - -test('findOne: .only() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', 'reference') - .only('reference', 'title') - .toJSON().findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - flag = entry.reference.every(function(reference) { - return (reference && "title" in reference && "uid" in reference); - }); - } else { - flag = true - } - assert.equal(flag, true, 'Entry has the reference with only paramteres.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - For the reference - String"); - assert.end(); - }); -}); - -test('findOne: .only() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .only('reference', ['title']) - .toJSON().findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference']) { - if (entry['reference'].length) { - if (entry['reference'].length === 0){ - flag = true - } else { - flag = entry.reference.every(function(reference) { - return (reference && "title" in reference && "uid" in reference); - }); - } - }else { - flag = true - } +describe("FindOne Tests", () => { + // Setup - Initialize the Contentstack Stack Instance + beforeAll((done) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(done, 1000); + }); + + describe("Default FindOne", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + + describe("Sorting", () => { + describe("Ascending", () => { + let entry; + let error = null; + const field = "created_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.ascending(field).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + + describe("Descending", () => { + let entry; + let error = null; + const field = "created_at"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.descending(field).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + }); + + describe("Comparison", () => { + describe("lessThan", () => { + let entry; + let error = null; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entry = await Query.lessThan("num_field", value).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("num_field should be less than specified value", () => { + expect(entry.num_field).toBeLessThan(value); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + + describe("lessThanOrEqualTo", () => { + let entry; + let error = null; + const value = 11; + + beforeAll(async () => { + const Query = Stack.ContentType( + contentTypes.numbers_content_type + ).Query(); + entry = await Query.lessThanOrEqualTo("num_field", value) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("num_field should be less than or equal to specified value", () => { + expect(entry.num_field).toBeLessThanOrEqual(value); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + }); + + describe("Array/Subset", () => { + describe("containedIn", () => { + let entry; + let error = null; + const _in = ["source1", "source2"]; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.containedIn("title", _in).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry title should be in the specified values", () => { + expect(_in).toContain(entry.title); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + + describe("notContainedIn", () => { + let entry; + let error = null; + const _in = ["source1", "source2", "source3", "source4"]; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.notContainedIn("title", _in).toJSON().findOne(); + }); + + test("Should either return an entry or an expected error", () => { + if (entry) { + expect(entry).toBeDefined(); + expect(_in).not.toContain(entry.title); + expect(entry.uid).toBeDefined(); + expect(entry.locale).toBeDefined(); + expect(entry.publish_details).toBeDefined(); + } else { + expect(error).toEqual({ + error_code: 141, + error_message: "The requested entry doesn't exist.", + }); + } + }); + }); + }); + + describe("Element Existence", () => { + describe("exists", () => { + let entry; + let error = null; + const queryField = "boolean"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.exists(queryField).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have the queried field", () => { + expect(typeof entry[queryField]).not.toBe("undefined"); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + + describe("notExists", () => { + let entry; + let error = null; + const queryField = "isspecial"; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.notExists(queryField).toJSON().findOne(); + }); + + test("Should either have entry without field or proper error", () => { + if (entry) { + expect(typeof entry[queryField]).toBe("undefined"); + expect(entry.uid).toBeDefined(); + expect(entry.locale).toBeDefined(); + expect(entry.publish_details).toBeDefined(); + } else { + expect(error).toEqual({ + error_code: 141, + error_message: "The requested entry doesn't exist.", + }); + } + }); + }); + }); + + describe("Pagination", () => { + describe("skip", () => { + let allEntries; + let skippedEntry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + allEntries = await Query.toJSON().find(); + + const SkipQuery = Stack.ContentType(contentTypes.source).Query(); + skippedEntry = await SkipQuery.skip(1).toJSON().findOne(); + }); + + test("Should have entries in the result set", () => { + expect(allEntries.length).toBeTruthy(); + }); + + test("Should get correct skipped entry", () => { + expect(skippedEntry).toEqual(allEntries[0][1]); + }); + }); + }); + + describe("Logical Operations", () => { + describe("OR Query Objects", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .containedIn("title", ["source1", "source2"]); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", true); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entry = await Query.or(Query1, Query2).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should satisfy the OR condition", () => { + const condition = + entry.title === "source1" || + entry.title === "source2" || + entry.boolean === true; + expect(condition).toBeTruthy(); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + + describe("AND Query Objects", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query1 = Stack.ContentType(contentTypes.source) + .Query() + .where("title", "source1"); + const Query2 = Stack.ContentType(contentTypes.source) + .Query() + .where("boolean", true); + const Query = Stack.ContentType(contentTypes.source).Query(); + + entry = await Query.and(Query1, Query2).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should satisfy the AND condition", () => { + const condition = entry.title === "source1" && entry.boolean === true; + expect(condition).toBeTruthy(); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + + describe("Raw Query", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.query({ + $or: [{ title: "source1" }, { boolean: "false" }], + }) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should satisfy the OR condition in raw query", () => { + const condition = entry.title === "source1" || entry.boolean === false; + expect(condition).toBeTruthy(); + }); + + test("Entry should have uid", () => { + expect(entry.uid).toBeDefined(); + }); + + test("Entry should have locale", () => { + expect(entry.locale).toBeDefined(); + }); + + test("Entry should have publish_details", () => { + expect(entry.publish_details).toBeDefined(); + }); + }); + }); + + describe("Localization", () => { + describe("Without Fallback", () => { + let entry; + let error = null; + const _in = ["ja-jp"]; + + beforeAll(async () => { + entry = await Stack.ContentType(contentTypes.source) + .Query() + .language("ja-jp") + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have correct locale in publish_details", () => { + expect(_in).toContain(entry.publish_details.locale); + }); + }); + + describe("With Fallback", () => { + let entry; + let error = null; + const _in = ["ja-jp", "en-us"]; + + beforeAll(async () => { + entry = await Stack.ContentType(contentTypes.source) + .Query() + .language("ja-jp") + .includeFallback() + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should have locale from allowed fallback list", () => { + expect(_in).toContain(entry.publish_details.locale); + }); + }); + }); + describe("Including References", () => { + describe("includeReference - String", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("All present references should be included as objects", () => { + expect( + entry && entry.reference && typeof entry.reference === "object" + ).toBe(true); + }); + }); + + describe("includeReference - Array", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference(["reference", "other_reference"]) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("All present references should be included as objects", () => { + const condition = + entry && + entry.reference && + typeof entry.reference === "object" && + entry.other_reference && + typeof entry.other_reference === "object"; + expect(condition).toBe(true); + }); + }); + }); + + describe("Including Schema", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeSchema().toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + }); + + describe("Including ContentType", () => { + let entry; + let contentType; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + [entry, contentType] = await new Promise((resolve, reject) => { + Query.includeContentType() + .toJSON() + .findOne() + .then((entry, contentType) => resolve([entry, contentType]), reject); + }); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("ContentType should not be present", () => { + expect(typeof contentType).toBe("undefined"); + }); + }); + + describe("Including Schema and ContentType", () => { + let entry; + let contentType; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + [entry, contentType] = await new Promise((resolve, reject) => { + Query.includeSchema() + .includeContentType() + .toJSON() + .findOne() + .then((entry, contentType) => resolve([entry, contentType]), reject); + }); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("ContentType should not be present", () => { + expect(typeof contentType).toBe("undefined"); + }); + }); + + describe("Field Selection - Only", () => { + describe("only - Single String Parameter", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.only("title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should only contain title and uid fields", () => { + expect(Object.keys(entry).length).toBe(2); + expect(entry).toHaveProperty("title"); + expect(entry).toHaveProperty("uid"); + }); + }); + + describe("only - Multiple String Parameters", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.only("BASE", "title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should only contain title and uid fields", () => { + expect(Object.keys(entry).length).toBe(2); + expect(entry).toHaveProperty("title"); + expect(entry).toHaveProperty("uid"); + }); + }); + + describe("only - Array Parameter", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.only(["title", "url"]).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should contain title, url, and uid fields", () => { + expect(Object.keys(entry).length).toBe(3); + expect(entry).toHaveProperty("title"); + expect(entry).toHaveProperty("url"); + expect(entry).toHaveProperty("uid"); + }); + }); + + describe("only - For reference - String", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", "reference") + .only("reference", "title") + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("References should have only specified fields", () => { + let flag = false; + if ( + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ) { + flag = entry.reference.every( + (reference) => + reference && "title" in reference && "uid" in reference + ); + } else { + flag = true; + } + expect(flag).toBe(true); + }); + }); + + describe("only - For reference - Array", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .only("reference", ["title"]) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("References should have only specified fields", () => { + let flag = false; + if (entry && entry["reference"]) { + if (entry["reference"].length) { + if (entry["reference"].length === 0) { + flag = true; } else { - flag = true - } - assert.equal(flag, true, 'Entry has the reference with only paramteres.'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .only() - For the reference - Array"); - assert.end(); - }); -}); - -// except -test('findOne: .except() - Single String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('title') - .toJSON().findOne() - .then(function success(entry) { - var flag = (entry && !("title" in entry)); - assert.ok(flag, 'entry without the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - Single String Parameter"); - assert.end(); - }); -}); - -test('findOne: .except() - Multiple String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except('BASE', 'title') - .toJSON().findOne() - .then(function success(entry) { - var flag = (entry && !("title" in entry)); - assert.ok(flag, 'entry without the field title in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - Multiple String Parameter"); - assert.end(); - }); -}); - -test('findOne: .except() - Array of String Parameter', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .except(['title', 'file']) - .toJSON().findOne() - .then(function success(entry) { - var flag = (entry && !("title" in entry) && !("file" in entry)); - assert.ok(flag, 'entry without the field title, file in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - Array of String Parameter"); - assert.end(); - }); -}); - -test('findOne: .except() - For the reference - String', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', 'reference') - .except('reference', 'title') - .toJSON().findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - flag = entry.reference.every(function(reference) { - return (reference && !("title" in reference)); - }); - } - assert.ok(flag, 'entry with the field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - For the reference - String"); - assert.end(); - }); -}); - -test('findOne: .except() - For the reference - Array', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .includeReference('reference') - .only('BASE', ['reference']) - .except('reference', ['title']) - .toJSON().findOne() - .then(function success(entry) { - var flag = false; - if (entry && entry['reference'] && typeof entry['reference'] === 'object') { - flag = entry.reference.every(function(reference) { - return (reference && !("title" in reference)); - }); + flag = entry.reference.every( + (reference) => + reference && "title" in reference && "uid" in reference + ); } - assert.ok(flag, 'entry with the field reference without title field in the resultset'); - assert.end(); - }, function error(err) { - console.error("Error :", err); - assert.fail("findOne: .except() - For the reference - Array"); - assert.end(); - }); -}); -/*! - * HTTP Error Handling - * !*/ - -test('findOne: should handle 422 Unprocessable Entity error', function(assert) { - const Query = Stack.ContentType("invalid_content_type").Query(); - - Query - .toJSON() - .findOne() - .then(function success() { - assert.fail("Expected 422 error but got a successful response."); - assert.end(); - }, function error(err) { - assert.equal(err.http_code, 422, 'Should return HTTP status 422.'); - assert.ok(err.http_message, 'Unprocessable Entity'); - assert.end(); - }); -}); - -test('findOne: should handle 412 Unauthorized error', function(assert) { - Stack.headers = { authorization: 'InvalidAPIKey' }; // Simulating an invalid API key - const Query = Stack.ContentType(contentTypes.source).Query(); - - Query - .toJSON() - .findOne() - .then(function success() { - assert.fail("Expected 412 error but got a successful response."); - assert.end(); - }, function error(err) { - assert.equal(err.http_code, 412, 'Should return HTTP status 412.'); - assert.ok(err.http_message, 'Precondition Failed.'); - assert.end(); - }); + } else { + flag = true; + } + } else { + flag = true; + } + expect(flag).toBe(true); + }); + }); + }); + + describe("Field Selection - Except", () => { + describe("except - Single String Parameter", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.except("title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should not contain the title field", () => { + expect(entry).not.toHaveProperty("title"); + }); + }); + + describe("except - Multiple String Parameters", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.except("BASE", "title").toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should not contain the title field", () => { + expect(entry).not.toHaveProperty("title"); + }); + }); + + describe("except - Array Parameter", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.except(["title", "file"]).toJSON().findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("Entry should not contain the title field", () => { + expect(entry).not.toHaveProperty("title"); + }); + + test("Entry should not contain the file field", () => { + expect(entry).not.toHaveProperty("file"); + }); + }); + + describe("except - For reference - String", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", "reference") + .except("reference", "title") + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("References should not contain the specified field", () => { + let flag = false; + if ( + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ) { + flag = entry.reference.every( + (reference) => reference && !("title" in reference) + ); + } + expect(flag).toBeTruthy(); + }); + }); + + describe("except - For reference - Array", () => { + let entry; + let error = null; + + beforeAll(async () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + entry = await Query.includeReference("reference") + .only("BASE", ["reference"]) + .except("reference", ["title"]) + .toJSON() + .findOne(); + }); + + test("Should return an entry", () => { + expect(entry).toBeDefined(); + }); + + test("References should not contain the specified field", () => { + let flag = false; + if ( + entry && + entry["reference"] && + typeof entry["reference"] === "object" + ) { + flag = entry.reference.every( + (reference) => reference && !("title" in reference) + ); + } + expect(flag).toBeTruthy(); + }); + }); + }); + + describe('HTTP Error Handling', () => { + describe('422 Unprocessable Entity Error', () => { + let success = false; + let error = null; + + beforeAll(async () => { + try { + const Query = Stack.ContentType("invalid_content_type").Query(); + await Query.toJSON().findOne(); + success = true; + } catch (err) { + error = err; + } + }); + + test("Should not succeed", () => { + expect(success).toBe(false); + }); + + test("Should return HTTP status 422", () => { + expect(error.http_code).toBe(422); + }); + + test("Should have appropriate error message", () => { + expect(error.http_message).toBeTruthy(); + }); + }); + + describe("412 Unauthorized Error", () => { + let success = false; + let error = null; + + beforeAll(async () => { + try { + Stack.headers = { authorization: "InvalidAPIKey" }; // Simulating an invalid API key + const Query = Stack.ContentType(contentTypes.source).Query(); + await Query.toJSON().findOne(); + success = true; + } catch (err) { + error = err; + } finally { + // Reset headers for subsequent tests + Stack.headers = {}; + } + }); + + test("Should not succeed", () => { + expect(success).toBe(false); + }); + + test("Should return HTTP status 412", () => { + expect(error.http_code).toBe(412); + }); + + test("Should have appropriate error message", () => { + expect(error.http_message).toBeTruthy(); + }); + }); + }); }); diff --git a/test/entry/spread.js b/test/entry/spread.js index b863c9c5..f6395c37 100755 --- a/test/entry/spread.js +++ b/test/entry/spread.js @@ -1,209 +1,286 @@ /** * Created by Aamod Pisat on 09-06-2017. */ -'use strict'; +"use strict"; /* * Module Dependencies. */ -const test = require('tape'); -const Contentstack = require('../../dist/node/contentstack.js'); -const init = require('../config.js'); +const Contentstack = require("../../dist/node/contentstack.js"); +const init = require("../config.js"); const contentTypes = init.contentTypes; -var Stack; -/* - * Initalise the Contentstack Instance - * */ -test('Initalise the Contentstack Stack Instance', function(TC) { - setTimeout(function() { - Stack = Contentstack.Stack(init.stack); - Stack.setHost(init.host); - TC.end(); - }, 1000); -}); +let Stack; + +describe("Spread Method Tests", () => { + // Setup - Initialize the Contentstack Stack Instance + beforeAll((done) => { + Stack = Contentstack.Stack(init.stack); + Stack.setHost(init.host); + setTimeout(done, 1000); + }); -test('entries as first argument', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; + describe("Entries as first argument", () => { + const field = "updated_at"; - Query - .limit(1) + test("Should have entries", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.limit(1) .toJSON() .find() .spread(function success(entries) { - assert.ok(entries.length, 'Entries exists as first parameter'); - if (entries && entries.length) { - var prev = entries[0][field]; - var _entries = entries.every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.end(); + expect(entries.length).toBeTruthy(); }); -}); + }); + + test("Should maintain default sorting of descending updated_at", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.limit(1) + .toJSON() + .find() + .spread(function success(entries) { + if (entries && entries.length) { + let prev = entries[0][field]; + const _entries = entries.every((entry) => { + prev = entry[field]; + return entry[field] <= prev; + }); + expect(_entries).toBe(true); + } + }); + }); + }); + + describe("With entries and count argument", () => { + const field = "updated_at"; + + test("Should have entries as first parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() + .toJSON() + .find() + .spread((entries) => { + expect(entries.length).toBeTruthy(); + }); + }); + + test("Should have count as second parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() + .toJSON() + .find() + .spread((_, count) => { + expect(count).toBeTruthy(); + }); + }); + + test("Should maintain default sorting of descending updated_at", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() + .toJSON() + .find() + .spread((entries) => { + if (entries && entries.length) { + let prev = entries[0][field]; + const _entries = entries.every((entry) => { + prev = entry[field]; + return entry[field] <= prev; + }); + expect(_entries).toBe(true); + } + }); + }); + }); + + describe("With entries, schema and count argument (includeSchema first)", () => { + const field = "updated_at"; -test('with entries and count argument', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query + test("Should have entries as first parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeSchema() .includeCount() .toJSON() .find() - .spread(function success(entries, count) { - assert.ok(entries.length, 'Entries exists as first parameter'); - assert.ok(count, 'Count exists as second parameter'); - if (entries && entries.length) { - var prev = entries[0][field]; - var _entries = entries.every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.end(); + .spread((entries) => { + expect(entries.length).toBeTruthy(); }); -}); + }); -test('with entries, schema and count argument', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query - .includeSchema() + test("Should have schema as second parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeSchema() .includeCount() .toJSON() .find() - .spread(function success(entries, schema, count) { - assert.ok(entries.length, 'Entries exists as first parameter'); - assert.ok(schema, 'Schema exists as second parameter'); - assert.ok(count, 'Count exists as third parameter'); - if (entries && entries.length) { - var prev = entries[0][field]; - var _entries = entries.every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.end(); + .spread((_, schema) => { + expect(schema).toBeTruthy(); }); -}); + }); -test('with entries, schema and count argument', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query + test("Should have count as third parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeSchema() .includeCount() - .includeSchema() .toJSON() .find() - .spread(function success(entries, schema, count) { - assert.ok(entries.length, 'Entries exists as first parameter'); - assert.ok(schema, 'Schema exists as second parameter'); - assert.ok(count, 'Count exists as third parameter'); - if (entries && entries.length) { - var prev = entries[0][field]; - var _entries = entries.every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.fail(err.message); - assert.end(); + .spread((_, __, count) => { + expect(count).toBeTruthy(); }); -}); + }); -test('with entries, content_type and count argument', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query - .includeContentType() + test("Should maintain default sorting of descending updated_at", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeSchema() .includeCount() .toJSON() .find() - .spread(function success(entries, contentType, count) { - assert.ok(entries.length, 'Entries exists as first parameter'); - assert.ok(contentType, 'ContentType exists as second parameter'); - assert.ok((contentType.uid === contentTypes.source), 'ContentType exists as second parameter'); - assert.ok(count, 'Count exists as third parameter'); - if (entries && entries.length) { - var prev = entries[0][field]; - var _entries = entries.every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.end(); + .spread((entries) => { + if (entries && entries.length) { + let prev = entries[0][field]; + const _entries = entries.every((entry) => { + prev = entry[field]; + return entry[field] <= prev; + }); + expect(_entries).toBe(true); + } }); -}); + }); + }); -test('with entries, content_type and count argument', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query + describe("With entries, content_type and count argument (includeContentType first)", () => { + const field = "updated_at"; + + test("Should have entries as first parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeContentType() .includeCount() - .includeContentType() .toJSON() .find() - .spread(function success(entries, contentType, count) { - assert.ok(entries.length, 'Entries exists as first parameter'); - assert.ok(contentType, 'ContentType exists as second parameter'); - assert.ok((contentType.uid === contentTypes.source), 'ContentType exists as second parameter'); - assert.ok(count, 'Count exists as third parameter'); - if (entries && entries.length) { - var prev = entries[0][field]; - var _entries = entries.every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.fail(err.message); - assert.end(); + .spread((entries) => { + expect(entries.length).toBeTruthy(); }); -}); + }); + + test("Should have contentType as second parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeContentType() + .includeCount() + .toJSON() + .find() + .spread((_, contentType) => { + expect(contentType).toBeTruthy(); + }); + }); -test('with entries, content_type|schema and count argument', function(assert) { - var Query = Stack.ContentType(contentTypes.source).Query(), - field = 'updated_at'; - Query + test("Should have correct contentType uid", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeContentType() .includeCount() + .toJSON() + .find() + .spread((_, contentType) => { + expect(contentType.uid).toBe(contentTypes.source); + }); + }); + + test("Should have count as third parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeContentType() + .includeCount() + .toJSON() + .find() + .spread((_, __, count) => { + expect(count).toBeTruthy(); + }); + }); + + test("Should maintain default sorting of descending updated_at", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeContentType() + .includeCount() + .toJSON() + .find() + .spread((entries) => { + if (entries && entries.length) { + let prev = entries[0][field]; + const _entries = entries.every((entry) => { + prev = entry[field]; + return entry[field] <= prev; + }); + expect(_entries).toBe(true); + } + }); + }); + }); + + describe("With entries, content_type|schema and count argument", () => { + const field = "updated_at"; + + test("Should have entries as first parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() + .includeSchema() + .includeContentType() + .toJSON() + .find() + .spread((entries) => { + expect(entries.length).toBeTruthy(); + }); + }); + + test("Should have contentType as second parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() .includeSchema() .includeContentType() .toJSON() .find() - .spread(function success(entries, contentType, count) { - assert.ok(entries.length, 'Entries exists as first parameter'); - assert.ok(contentType, 'ContentType exists as second parameter'); - assert.ok((contentType.uid === contentTypes.source), 'ContentType exists as second parameter'); - assert.ok(count, 'Count exists as third parameter'); - if (entries && entries.length) { - var prev = entries[0][field]; - var _entries = entries.every(function(entry) { - prev = entry[field]; - return (entry[field] <= prev); - }); - assert.equal(_entries, true, "default sorting of descending 'updated_at'"); - } - assert.end(); - }, function error(err) { - assert.fail(err.message); - assert.end(); - }); -}); \ No newline at end of file + .spread((_, contentType) => { + expect(contentType).toBeTruthy(); + }); + }); + + test("Should have correct contentType uid", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() + .includeSchema() + .includeContentType() + .toJSON() + .find() + .spread((_, contentType) => { + expect(contentType.uid).toBe(contentTypes.source); + }); + }); + + test("Should have count as third parameter", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() + .includeSchema() + .includeContentType() + .toJSON() + .find() + .spread((_, __, count) => { + expect(count).toBeTruthy(); + }); + }); + + test("Should maintain default sorting of descending updated_at", () => { + const Query = Stack.ContentType(contentTypes.source).Query(); + Query.includeCount() + .includeSchema() + .includeContentType() + .toJSON() + .find() + .spread((entries) => { + if (entries && entries.length) { + let prev = entries[0][field]; + const _entries = entries.every((entry) => { + prev = entry[field]; + return entry[field] <= prev; + }); + expect(_entries).toBe(true); + } + }); + }); + }); +}); diff --git a/test/live-preview/live-preview-test.js b/test/live-preview/live-preview-test.js index 7bd491d3..4ffc93e2 100644 --- a/test/live-preview/live-preview-test.js +++ b/test/live-preview/live-preview-test.js @@ -1,91 +1,90 @@ - 'use strict'; -const test = require('tape'); const Contentstack = require('../../dist/node/contentstack.js'); -test('should check for values initialized', function(assert) { +describe('Contentstack Live Preview Tests', () => { + test('should check for values initialized', () => { const stack = Contentstack.Stack({ - 'api_key': process.env.API_KEY, - 'delivery_token': process.env.DELIVERY_TOKEN, - 'environment': process.env.ENVIRONMENT + 'api_key': process.env.region_API_KEY, + 'delivery_token': process.env.DELIVERY_TOKEN, + 'environment': process.env.ENVIRONMENT }); + const livePreviewObject = stack.config.live_preview; - assert.equal(livePreviewObject.enable, false); - assert.equal(stack.config.host, 'cdn.contentstack.io'); // rest-preview.contentstack.com - assert.end(); -}); + expect(livePreviewObject.enable).toBe(false); + expect(stack.config.host).toBe('cdn.contentstack.io'); // rest-preview.contentstack.com + }); -test('should check host when live preview is enabled and management token is provided', function(assert) { + test('should check host when live preview is enabled and management token is provided', () => { const stack = Contentstack.Stack({ - 'api_key': process.env.API_KEY, - 'delivery_token': process.env.DELIVERY_TOKEN, - 'environment': process.env.ENVIRONMENT, - live_preview: { - enable: true, - management_token: 'management_token' - } + 'api_key': process.env.API_KEY, + 'delivery_token': process.env.DELIVERY_TOKEN, + 'environment': process.env.ENVIRONMENT, + live_preview: { + enable: true, + management_token: 'management_token' + } }); + const livePreviewObject = stack.config.live_preview; - assert.notEqual(livePreviewObject, 'undefined'); - assert.notEqual(livePreviewObject.enable, 'undefined'); - assert.notEqual(livePreviewObject.host, 'undefined'); - assert.equal(stack.config.host, 'cdn.contentstack.io'); // rest-preview.contentstack.com - assert.end(); -}); + expect(livePreviewObject).not.toBe('undefined'); + expect(livePreviewObject.enable).not.toBe('undefined'); + expect(livePreviewObject.host).not.toBe('undefined'); + expect(stack.config.host).toBe('cdn.contentstack.io'); // rest-preview.contentstack.com + }); -test('should check host when live preview is disabled and management token is provided', function(assert) { + test('should check host when live preview is disabled and management token is provided', () => { const stack = Contentstack.Stack({ - 'api_key': process.env.API_KEY, - 'delivery_token': process.env.DELIVERY_TOKEN, - 'environment': process.env.ENVIRONMENT, - live_preview: { - enable: false, - management_token: 'management_token' - } + 'api_key': process.env.API_KEY, + 'delivery_token': process.env.DELIVERY_TOKEN, + 'environment': process.env.ENVIRONMENT, + live_preview: { + enable: false, + management_token: 'management_token' + } }); + const livePreviewObject = stack.config.live_preview; - assert.notEqual(livePreviewObject, 'undefined'); - assert.equal(livePreviewObject.enable, false); - assert.notEqual(livePreviewObject.host, 'undefined'); - assert.end(); -}); + expect(livePreviewObject).not.toBe('undefined'); + expect(livePreviewObject.enable).toBe(false); + expect(livePreviewObject.host).not.toBe('undefined'); + }); -test('should check host when live preview is enabled and preview token is provided', function(assert) { + test('should check host when live preview is enabled and preview token is provided', () => { const stack = Contentstack.Stack({ - 'api_key': process.env.API_KEY, - 'delivery_token': process.env.DELIVERY_TOKEN, - 'environment': process.env.ENVIRONMENT, - live_preview: { - enable: true, - preview_token: 'preview_token' - } + 'api_key': process.env.API_KEY, + 'delivery_token': process.env.DELIVERY_TOKEN, + 'environment': process.env.ENVIRONMENT, + live_preview: { + enable: true, + preview_token: 'preview_token' + } }); + const livePreviewObject = stack.config.live_preview; - assert.notEqual(livePreviewObject, 'undefined'); - assert.notEqual(livePreviewObject.enable, 'undefined'); - assert.notEqual(livePreviewObject.host, 'undefined'); - assert.notEqual(livePreviewObject.preview_token, 'undefined'); - assert.equal(stack.config.host, 'cdn.contentstack.io'); - assert.end(); -}); + expect(livePreviewObject).not.toBe('undefined'); + expect(livePreviewObject.enable).not.toBe('undefined'); + expect(livePreviewObject.host).not.toBe('undefined'); + expect(livePreviewObject.preview_token).not.toBe('undefined'); + expect(stack.config.host).toBe('cdn.contentstack.io'); + }); -test('should check host when live preview is disabled and preview token is provided', function(assert) { + test('should check host when live preview is disabled and preview token is provided', () => { const stack = Contentstack.Stack({ - 'api_key': process.env.API_KEY, - 'delivery_token': process.env.DELIVERY_TOKEN, - 'environment': process.env.ENVIRONMENT, - live_preview: { - enable: false, - preview_token: 'preview_token' - } + 'api_key': process.env.API_KEY, + 'delivery_token': process.env.DELIVERY_TOKEN, + 'environment': process.env.ENVIRONMENT, + live_preview: { + enable: false, + preview_token: 'preview_token' + } }); + const livePreviewObject = stack.config.live_preview; - assert.notEqual(livePreviewObject, 'undefined'); - assert.notEqual(livePreviewObject.enable, 'undefined'); - assert.notEqual(livePreviewObject.host, 'undefined'); - assert.notEqual(livePreviewObject.preview_token, 'undefined'); - assert.equal(stack.config.host, 'cdn.contentstack.io'); - assert.end(); -}); - + expect(livePreviewObject).not.toBe('undefined'); + expect(livePreviewObject.enable).not.toBe('undefined'); + expect(livePreviewObject.host).not.toBe('undefined'); + expect(livePreviewObject.preview_token).not.toBe('undefined'); + expect(stack.config.host).toBe('cdn.contentstack.io'); + }); +}); \ No newline at end of file