// OFM unit testing configuration file.

import { defineConfig } from "vitest/config";
import vue from "@vitejs/plugin-vue";
import path from "path";

export default defineConfig({
  plugins: [
    vue({
      template: {
        compilerOptions: {
          // This configuration is set to avoid vue warns about missing refs.
          // Forces the test to render all html as dynamic, and avoid hoisting.
          hoistStatic: false,
        },
      },
    }),
  ],

  test: {
    // CSS is disabled for now, the test loads the DOM without styles.
    css: false,
    pool: "forks",
    // Runs in a single thread to avoid CI pipeline crashing.
    singleThread: true,

    // Switch loading vue features
    define: {
      // Feature not needed for current testing
      __VUE_PROD_DEVTOOLS__: false,
      // We use and enforce VUE optionsAPI
      __VUE_OPTIONS_API__: true,
    },

    // Coverage analysis tools setup
    coverage: {
      enabled: true,
      provider: "v8",
      clean: true,
      cleanOnStart: true,
      // text gives output on STOUT and html creates an artifact
      reporter: ["text", "html", "cobertura"],
      all: true,
      // Files to include or exclude in coverage
      include: ["src/**/*.vue", "src/**/*.js"],
      exclude: [],
      // These thresholds raise ERROR if the coverage it's under the provided percentages.
      // As the coverage is low we set the limit low, as testing spec files increase,
      // these thresholds need to increase accordingly.
      thresholds: {
        lines: 4,
        statements: 3,
        functions: 2,
        branches: 1,
      },
    },
    // Add largest component dependencies here
    // This chunks together the largest libraries to avoid recurrent parsing and loading
    // and increasing memory overhead. Good for CI.
    deps: {
      optimizer: {
        web: {
          enabled: true,
          include: ["uikit", "openseadragon", "material-symbols"],
        },
      },
    },

    // This is the package responsible for simulating the DOM the other option is JSDOM
    // Happy-dom is the most efficient in memory and its future proof for later node versions.
    environment: "happy-dom",

    globals: true, // Probably good for Mixins

    // This tells vitest to not skip loading these packages,
    // and load them from the local node_modules at run time.
    server: {
      deps: {
        inline: ["vue", "@vue/test-utils", "pinia", "@pinia/testing"],
      },
    },
  },

  // This is to enforce the use of specific packages versions on the testing.
  // This one for example says to load explicitly the vue package at the project's level,
  // and not the global vue if existing.
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
      vue: path.resolve(__dirname, "./node_modules/vue"),
    },
  },
});
