Skip to content
Snippets Groups Projects
  • Nemanja Glumac's avatar
    f71f20e1
    [E2E] Regroup and move all related files to the root (#28749) · f71f20e1
    Nemanja Glumac authored
    * Register new E2E path alias
    
    * Move E2E support files
    
    * Move E2E runner files
    
    * Move E2E snapshot related files
    
    * Move E2E visual regression tests
    
    * Move E2E `downloads` scenarios
    
    * Move E2E `admin` scenarios
    
    * Move E2E `auditing` scenarios
    
    * Move E2E `bining` scenarios
    
    * Move E2E `ccollections` scenarios
    
    * Move E2E `cross-version` scenarios
    
    * Move E2E `custom-column` scenarios
    
    * Move E2E `dashboard` scenarios
    
    * Move E2E `dashboard-filters` scenarios
    
    * Move E2E `dashboard` reproductions
    
    * Move E2E `embedding` scenarios
    
    * Move E2E `filters` scenarios
    
    * Move E2E `joins` scenarios
    
    * Move E2E `models` scenarios
    
    * Move E2E `native-filters` scenarios
    
    * Move E2E `native` scenarios
    
    * Move E2E `onboarding` scenarios
    
    * Move E2E `organization` scenarios
    
    * Move E2E `permissions` scenarios
    
    * Move E2E `question` scenarios
    
    * Move E2E `visualizations` scenarios
    
    * Move E2E `sharing` scenarios
    
    * Move E2E `docker-compose`
    
    * Fix commands imports
    
    * Fix helpers imports
    
    * Fix downloads reproductions imports
    
    * Fix integration imports
    
    * Move visual regression tests
    
    * Various fixes
    
    * Move `validate-e2e-files` script
    
    * Add eslint rules for E2E folder
    
    * Improve file paths
    
    * Move `cross-version` tests into scenarios
    
    * Path fixes
    
    * Register E2E alias in tsconfig
    
    * Fix failing tests after rebase
    [E2E] Regroup and move all related files to the root (#28749)
    Nemanja Glumac authored
    * Register new E2E path alias
    
    * Move E2E support files
    
    * Move E2E runner files
    
    * Move E2E snapshot related files
    
    * Move E2E visual regression tests
    
    * Move E2E `downloads` scenarios
    
    * Move E2E `admin` scenarios
    
    * Move E2E `auditing` scenarios
    
    * Move E2E `bining` scenarios
    
    * Move E2E `ccollections` scenarios
    
    * Move E2E `cross-version` scenarios
    
    * Move E2E `custom-column` scenarios
    
    * Move E2E `dashboard` scenarios
    
    * Move E2E `dashboard-filters` scenarios
    
    * Move E2E `dashboard` reproductions
    
    * Move E2E `embedding` scenarios
    
    * Move E2E `filters` scenarios
    
    * Move E2E `joins` scenarios
    
    * Move E2E `models` scenarios
    
    * Move E2E `native-filters` scenarios
    
    * Move E2E `native` scenarios
    
    * Move E2E `onboarding` scenarios
    
    * Move E2E `organization` scenarios
    
    * Move E2E `permissions` scenarios
    
    * Move E2E `question` scenarios
    
    * Move E2E `visualizations` scenarios
    
    * Move E2E `sharing` scenarios
    
    * Move E2E `docker-compose`
    
    * Fix commands imports
    
    * Fix helpers imports
    
    * Fix downloads reproductions imports
    
    * Fix integration imports
    
    * Move visual regression tests
    
    * Various fixes
    
    * Move `validate-e2e-files` script
    
    * Add eslint rules for E2E folder
    
    * Improve file paths
    
    * Move `cross-version` tests into scenarios
    
    * Path fixes
    
    * Register E2E alias in tsconfig
    
    * Fix failing tests after rebase
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
validate-e2e-test-files.js 2.49 KiB
#!/usr/bin/env node
const { execSync } = require("child_process");

const path = require("path");
const glob = require("glob");
const chalk = require("chalk");

const E2E_FILE_EXTENSION = ".cy.spec.js";
const E2E_HOME = "e2e/test/";

init();

function validateE2EFileNames(files) {
  if (!files || !Array.isArray(files)) {
    return;
  }

  const invalidFileNames = files.filter(fullPath => {
    return !path.basename(fullPath).endsWith(E2E_FILE_EXTENSION);
  });

  printFeedback(invalidFileNames);
}

/**
 * @param {Array<string>} [files] Potential payload if used with `lint-staged`
 */
function validateStagedFiles(files) {
  validateE2EFileNames(files || getStagedFiles());
}

function validateAllFiles() {
  const allE2EFiles = getAllE2EFiles();
  validateE2EFileNames(allE2EFiles);
}

function getAllE2EFiles() {
  // Will match all files in the scenarios dir, except the ones in helpers and shared directories
  const PATTERN = `${E2E_HOME}*/{*.js,!(helpers|shared)/*.js}`;

  return glob.sync(PATTERN);
}

function getStagedFiles() {
  const stagedFiles = execSync("git diff HEAD --name-only --diff-filter=d", {
    encoding: "utf8",
  });
  const hasRelevantFiles = stagedFiles.includes(E2E_HOME);

  if (hasRelevantFiles) {
    return stagedFiles.split("\n").filter(isE2ETestFile);
  }
}

function isE2ETestFile(fullPath) {
  const dirName = path.dirname(fullPath);
  const excludedPaths =
    dirName.endsWith("/helpers") || dirName.endsWith("/shared");
  return dirName.startsWith(E2E_HOME) && !excludedPaths;
}

function printHints() {
  console.log(
    "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -",
  );
  console.log(
    `• Please make sure E2E specs have '${E2E_FILE_EXTENSION}' file extension.`,
  );
  console.log(
    `• You can place helpers and support files in 'helpers' or 'support' directories.`,
  );
  console.log(
    "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -",
  );
}

function printFeedback(invalidFileNames) {
  if (invalidFileNames.length) {
    console.error(
      chalk.red(
        `\nFound Cypress files not ending with '${E2E_FILE_EXTENSION}':\n\n`,
      ) + invalidFileNames.join("\n"),
    );

    printHints();

    process.exit(1);
  }

  console.log("E2E file naming looks correct. Well done!");
}

function init() {
  const payload = process.argv.slice(2);
  const [scope] = payload;

  if (!payload.length) {
    validateAllFiles();
  } else {
    scope === "--staged" ? validateStagedFiles() : validateStagedFiles(payload);
  }
}