PromucFlow_constructor/app/client/cypress/plugins/index.js
sharanya-appsmith a1fb4ba197
test: Cypress - Added cypress grep library (#29259)
Leveraging the library

[cypress-grep](https://github.com/cypress-io/cypress/tree/develop/npm/grep).
Using this we can tag testcases with relevant tags and use it to run
specific testcases.

**Command to run in local:** 
`CYPRESS_grepTags=@tag.Binding,@tag.Git npx cypress run
`
Pass the tags to CYPRESS_grepTags argument and only the test cases which
has the
tags passed will be picked to run. ex `@tag.Binding and @tag.Git` are
the tag names here.

**Tags can be added in the description on the test case like** 
`{ tags: ["@tag.Datasource"] }` for a single tag
`{ tags: ["@tag.Datasource", "@tag.Git"] }` for multiple tags 

**How to run In CI**
Single Tag - `/ok-to-test tags=@tag.Binding`
Multiple tag - `/ok-to-test tags=@tag.Binding,@tag.Git`


**TODOs in the next release:** 
- [ ] Add tags.ts file with all needed tags
- [ ] Add tags to remaining spec files. 
- [ ] Fail the PR run if tags added are not from tag.ts and post the
message on the same

#### Type of change
- Chore (housekeeping or task changes that don't impact user perception)
- This change requires a documentation update

#### How Has This Been Tested?
- [x] Manual
- [ ] JUnit
- [ ] Jest
- [x] Cypress

## Checklist:
#### Dev activity
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


#### QA activity:
- [x] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [ ] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [x] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
  - Added a search functionality to the app.

- **Enhancements**
- Integrated search bar at the top of the `Hero` component and a
`Search` component to the `App` component.
  - Added styles for the search bar.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Arpit Mohan <arpit@appsmith.com>
2023-12-07 18:23:27 +05:30

244 lines
7.1 KiB
JavaScript

/// <reference types="cypress" />
const fs = require("fs");
const path = require("path");
const dotenv = require("dotenv");
const chalk = require("chalk");
const cypressLogToOutput = require("cypress-log-to-output");
const installLogsPrinter = require("cypress-terminal-report/src/installLogsPrinter");
const {
addMatchImageSnapshotPlugin,
} = require("cypress-image-snapshot/plugin");
const { tagify } = require("cypress-tags");
const { cypressHooks } = require("../scripts/cypress-hooks");
const { cypressSplit } = require("../scripts/cypress-split");
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/**
* @type {Cypress.PluginConfig}
*/
module.exports = async (on, config) => {
// on("task", {
// isFileExist,
// });
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
cypressLogToOutput.install(on, (type, event) => {
if (event.level === "error" || event.type === "error") {
return true;
}
return false;
});
const logsPrinterOptions = {
outputRoot: config.projectRoot + "/cypress/",
outputTarget: {
"cypress-logs|json": "json",
},
specRoot: "cypress/e2e",
printLogsToFile: "onFail",
};
installLogsPrinter(on, logsPrinterOptions);
on("file:preprocessor", tagify(config));
addMatchImageSnapshotPlugin(on, config);
on("before:browser:launch", (browser = {}, launchOptions) => {
/*
Uncomment below to get console log printed in cypress output
*/
launchOptions.args = cypressLogToOutput.browserLaunchHandler(
browser,
launchOptions.args,
);
if (browser.name === "chrome") {
const video = path.join(
"cypress",
"fixtures",
"Videos",
"webCamVideo.y4m",
);
launchOptions.args.push("--disable-dev-shm-usage");
launchOptions.args.push("--window-size=1400,1100");
launchOptions.args.push("--use-fake-ui-for-media-stream");
launchOptions.args.push("--use-fake-device-for-media-stream");
//Stream default video source for camera & code scanner
launchOptions.args.push(`--use-file-for-fake-video-capture=${video}`);
return launchOptions;
}
if (browser.name === "electron") {
// && browser.isHeadless) {
launchOptions.preferences.fullscreen = true;
launchOptions.preferences.darkTheme = true;
launchOptions.preferences.width = 1400;
launchOptions.preferences.height = 1100;
launchOptions.preferences.resizable = false;
return launchOptions;
}
});
// module.exports = (on, config) => {
// on("after:spec", (spec, results) => {
// if (results && results.video) {
// // Do we have failures for any retry attempts?
// const failures = _.some(results.tests, (test) => {
// return _.some(test.attempts, { state: "failed" });
// });
// if (!failures) {
// // delete the video if the spec passed and no tests retried
// return del(results.video);
// }
// }
// });
// };
/**
* Fallback to APPSMITH_* env variables for Cypress.env if config.env doesn't already have it.
* Note: APPSMITH_* ENV vars have lower precedence than *all* methods mentioned in https://docs.cypress.io/guides/guides/environment-variables.html
* Example #1:
* process.env -> APPSMITH_FOO=bar
* cypress.json -> APPSMITH_FOO=baz
*
* Cypress.env("APPSMITH_FOO") // baz
*
* Example #2:
* process.env -> APPSMITH_FOO=bar
* cypress.json -> APPSMITH_FOO=
*
* Cypress.env("APPSMITH_FOO") // <empty>
*/
Object.keys(process.env).forEach((key) => {
if (
key.startsWith("APPSMITH_") &&
!Object.prototype.hasOwnProperty.call(config.env, key)
) {
config.env[key] = process.env[key];
}
});
/**
* Fallback to .env variables for Cypress.env if procecss.env doesn't have it either
* Note: Value in .env file has the lowest precedence, even lower than APPSMITH_* ENV vars.
* Example:
* .env -> APPSMITH_FOO=bar
* process.env -> APPSMITH_FOO=
*
* Cypress.env("APPSMITH_FOO") // <empty>
*/
try {
const parsedEnv = dotenv.parse(
fs.readFileSync(path.join(__dirname, "../../../../.env"), {
encoding: "utf-8",
}),
);
Object.keys(parsedEnv).forEach((key) => {
if (!Object.prototype.hasOwnProperty.call(config.env, key)) {
config.env[key] = parsedEnv[key];
}
});
} catch (e) {
console.error(
chalk.yellow(
"\n====================================================================================================\n" +
chalk.red(e.message) +
"\n\n" +
"Could not load env variables from .env file, make sure you have one!\n" +
"====================================================================================================\n",
),
);
}
/**
* This task logs the message on the CLI terminal. Use with care because it can log sensitive details
* Example usage: cy.task('log', 'This is the message printed to the terminal')
*/
on("task", {
log(message) {
console.log(message);
return null;
},
/*
Change video source for for camera & code scanner
*/
changeVideoSource(videoSource) {
console.log("TASK - Changing video source to", videoSource);
const webcamPath = path.join(
"cypress",
"fixtures",
"Videos",
"webCamVideo.y4m",
);
const defaultVideoPath = path.join(
"cypress",
"fixtures",
"Videos",
videoSource,
);
const video = fs.readFileSync(defaultVideoPath);
fs.writeFile(webcamPath, video);
return null;
},
/*
Reset video source to default
*/
resetVideoSource() {
console.log("TASK - Resetting video source");
const webcamPath = path.join(
"cypress",
"fixtures",
"Videos",
"webCamVideo.y4m",
);
const defaultVideoPath = path.join(
"cypress",
"fixtures",
"Videos",
"defaultVideo.y4m",
);
const video = fs.readFileSync(defaultVideoPath);
fs.writeFile(webcamPath, video);
return null;
},
});
console.log("Type of 'config.specPattern':", typeof config.specPattern);
/**
* Cypress grep plug return specPattern as object and with absolute path
*/
if (typeof config.specPattern == "object") {
config.specPattern = config.specPattern.map((spec) => {
return spec.replace(process.cwd() + "/", "");
});
}
console.log("config.specPattern:", config.specPattern);
if (process.env["RUNID"]) {
config = await new cypressSplit().splitSpecs(on, config);
cypressHooks(on, config);
}
return config;
};