diff --git a/client/nightwatch.conf.js b/client/nightwatch.conf.js new file mode 100644 index 00000000..93569f17 --- /dev/null +++ b/client/nightwatch.conf.js @@ -0,0 +1,19 @@ +const path = require('path'); +const LAUNCH_URL = process.env.LAUNCH_URL || 'http://localhost:3000'; + +module.exports = { + page_objects_path: path.join(__dirname, 'tests' , 'acceptance', 'pageObjects'), + test_settings: { + default: { + launch_url: LAUNCH_URL, + selenium: { + start_process: false, + host: 'localhost', + port: 4444, + }, + desiredCapabilities: { + browserName: 'chrome', + }, + }, + }, +}; \ No newline at end of file diff --git a/client/package.json b/client/package.json index e9af83c9..ae6bc264 100755 --- a/client/package.json +++ b/client/package.json @@ -114,6 +114,8 @@ }, "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@cucumber/cucumber": "^7.3.1", + "@cucumber/pretty-formatter": "^1.0.0-alpha.1", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", @@ -125,6 +127,8 @@ "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.36.1", "eslint-plugin-react-hooks": "^4.6.2", + "nightwatch": "^1.7.8", + "nightwatch-api": "^3.0.2", "react-test-renderer": "18.2.0" } } diff --git a/client/tests/acceptance/cucumber.conf.js b/client/tests/acceptance/cucumber.conf.js new file mode 100644 index 00000000..66e58ad8 --- /dev/null +++ b/client/tests/acceptance/cucumber.conf.js @@ -0,0 +1,25 @@ +const { + After, + Before, + AfterAll, + BeforeAll, + setDefaultTimeout, +} = require("@cucumber/cucumber"); +const { createSession, closeSession } = require("nightwatch-api"); + +setDefaultTimeout(60000); +// runs before all scenarios +BeforeAll(async function () {}); + +// runs before each scenario +Before(async function () { + await createSession(); +}); + +// runs after each scenario +After(async function () { + await closeSession(); +}); + +// runs after all scenarios +AfterAll(async function () {}); diff --git a/client/tests/acceptance/pageObjects/dashboardPage.js b/client/tests/acceptance/pageObjects/dashboardPage.js new file mode 100644 index 00000000..3303d398 --- /dev/null +++ b/client/tests/acceptance/pageObjects/dashboardPage.js @@ -0,0 +1,20 @@ +module.exports = { + url: function () { + return this.api.launchUrl + "/dashboard"; + }, + commands: { + isDashboardPage: async function () { + let result = false; + await this.waitForElementVisible("@dashboardHeader"); + await this.isVisible("@dashboardHeader", (res) => { + result = res.value; + }); + return result; + }, + }, + elements: { + dashboardHeader: { + selector: "a.Header_title__3SEjb", + }, + }, +}; diff --git a/client/tests/acceptance/pageObjects/loginPage.js b/client/tests/acceptance/pageObjects/loginPage.js new file mode 100644 index 00000000..7b54d963 --- /dev/null +++ b/client/tests/acceptance/pageObjects/loginPage.js @@ -0,0 +1,26 @@ +module.exports = { + url: function () { + return this.api.launchUrl + "/login"; + }, + commands: { + logIn: function (email, password) { + return this.waitForElementVisible("@emailInput") + .setValue("@emailInput", email) + .waitForElementVisible("@passwordInput") + .setValue("@passwordInput", password) + .waitForElementVisible("@loginBtn") + .click("@loginBtn"); + }, + }, + elements: { + emailInput: { + selector: "input[name=emailOrUsername]", + }, + passwordInput: { + selector: "input[name=password]", + }, + loginBtn: { + selector: "form button", + }, + }, +};