Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8800a3be1 | ||
|
|
1f23b58d1e | ||
|
|
3eba32c235 | ||
|
|
e35d59c652 | ||
|
|
be98715045 |
+13
-11
@@ -3,6 +3,8 @@ name: Automated Tests
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "0 2 * * *"
|
||||
@@ -11,13 +13,13 @@ permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: frontend-tests-${{ github.workflow }}-${{ github.ref }}
|
||||
group: frontend-tests-${{ github.workflow }}-${{ github.head_ref || github.ref_name }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
format-tests:
|
||||
# CI runs on the repository's self-hosted runner pool.
|
||||
runs-on: [self-hosted, Linux, X64, default]
|
||||
runs-on: [self-hosted, Linux, X64, pleno, frontend]
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -27,7 +29,6 @@ jobs:
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
|
||||
- name: Check AI workflow sync
|
||||
run: node scripts/sync-ai-workflow.mjs --check
|
||||
@@ -40,7 +41,7 @@ jobs:
|
||||
|
||||
build-and-unit:
|
||||
needs: format-tests
|
||||
runs-on: [self-hosted, Linux, X64, default]
|
||||
runs-on: [self-hosted, Linux, X64, pleno, frontend]
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -50,7 +51,6 @@ jobs:
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci --legacy-peer-deps
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
if: github.event_name != 'schedule'
|
||||
needs: build-and-unit
|
||||
name: E2E-pr-${{ matrix.suite }}-${{ matrix.project }}
|
||||
runs-on: [self-hosted, Linux, X64]
|
||||
runs-on: [self-hosted, Linux, X64, pleno, frontend]
|
||||
timeout-minutes: 30
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -117,7 +117,6 @@ jobs:
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci --legacy-peer-deps
|
||||
@@ -130,8 +129,10 @@ jobs:
|
||||
env:
|
||||
MATRIX_SUITE: ${{ matrix.suite }}
|
||||
MATRIX_PROJECT: ${{ matrix.project }}
|
||||
RUN_ID: ${{ github.run_id }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
workflow_offset=$(( (RUN_ID % 90) * 600 ))
|
||||
case "$MATRIX_SUITE" in
|
||||
core) suite_offset=0 ;;
|
||||
changed) suite_offset=10 ;;
|
||||
@@ -142,7 +143,7 @@ jobs:
|
||||
chromium-mobile) project_offset=2 ;;
|
||||
*) echo "Unsupported Playwright PR project: $MATRIX_PROJECT" >&2; exit 1 ;;
|
||||
esac
|
||||
echo "PLAYWRIGHT_DEV_PORT=$((5200 + suite_offset + project_offset))" >> "$GITHUB_ENV"
|
||||
echo "PLAYWRIGHT_DEV_PORT=$((10000 + workflow_offset + suite_offset + project_offset))" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Run Playwright smoke tests
|
||||
if: matrix.suite == 'core'
|
||||
@@ -182,7 +183,7 @@ jobs:
|
||||
(github.event_name == 'schedule' || needs.e2e-pr.result == 'success')
|
||||
needs: [build-and-unit, e2e-pr]
|
||||
name: E2E-full-${{ matrix.role }}-${{ matrix.browser_label }}-${{ matrix.device }}
|
||||
runs-on: [self-hosted, Linux, X64]
|
||||
runs-on: [self-hosted, Linux, X64, pleno, frontend]
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -212,7 +213,6 @@ jobs:
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci --legacy-peer-deps
|
||||
@@ -226,8 +226,10 @@ jobs:
|
||||
MATRIX_ROLE: ${{ matrix.role }}
|
||||
MATRIX_BROWSER: ${{ matrix.browser }}
|
||||
MATRIX_DEVICE: ${{ matrix.device }}
|
||||
RUN_ID: ${{ github.run_id }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
workflow_offset=$(( (RUN_ID % 90) * 600 ))
|
||||
case "$MATRIX_ROLE" in
|
||||
customer) role_offset=0 ;;
|
||||
subuser) role_offset=100 ;;
|
||||
@@ -247,7 +249,7 @@ jobs:
|
||||
desktop) device_offset=3 ;;
|
||||
*) echo "Unsupported Playwright device: $MATRIX_DEVICE" >&2; exit 1 ;;
|
||||
esac
|
||||
echo "PLAYWRIGHT_DEV_PORT=$((5300 + role_offset + browser_offset + device_offset))" >> "$GITHUB_ENV"
|
||||
echo "PLAYWRIGHT_DEV_PORT=$((10000 + workflow_offset + role_offset + browser_offset + device_offset))" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Run full Playwright slice
|
||||
run: |
|
||||
|
||||
@@ -17,9 +17,6 @@ export const Config = {
|
||||
value: value,
|
||||
});
|
||||
},
|
||||
test_customer_registration_webhook: async () => {
|
||||
return authenticatedRequest("/slack/config/test", "POST", {});
|
||||
},
|
||||
keys: {
|
||||
customer_registration_webhook_url: {
|
||||
get: async () => {
|
||||
|
||||
@@ -2335,12 +2335,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack-webhook der modtager en besked, når en ny kunderegistrering lykkes. Lad feltet være tomt for at deaktivere.",
|
||||
"notification_settings": "Notifikationer",
|
||||
"notification_settings_desc": "Slack-webhooks til systemhændelser.",
|
||||
"send_test_webhook": "Send test-webhook",
|
||||
"subtitle": "Konfiguration af Slack-notifikationer",
|
||||
"test_webhook_error": "Kunne ikke sende Slack-testwebhooken.",
|
||||
"test_webhook_not_configured": "Gem en webhook-URL til kunderegistreringer, før du sender en test.",
|
||||
"test_webhook_sent": "Slack-test sendt",
|
||||
"test_webhook_sent_success": "Slack-testbeskeden for kunderegistrering blev sendt.",
|
||||
"title": "Slack-konfiguration",
|
||||
"unavailable": "Slack-konfigurationen er ikke tilgængelig i denne API-udgivelse."
|
||||
},
|
||||
|
||||
@@ -2445,12 +2445,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack-Webhook, der eine Nachricht erhaelt, wenn eine neue Kundenregistrierung erfolgreich ist. Leer lassen, um dies zu deaktivieren.",
|
||||
"notification_settings": "Benachrichtigungseinstellungen",
|
||||
"notification_settings_desc": "Slack-Webhooks fuer Systemereignisse.",
|
||||
"send_test_webhook": "Test-Webhook senden",
|
||||
"subtitle": "Konfiguration von Slack-Benachrichtigungen",
|
||||
"test_webhook_error": "Der Slack-Test-Webhook konnte nicht gesendet werden.",
|
||||
"test_webhook_not_configured": "Speichern Sie zuerst eine Webhook-URL fuer Kundenregistrierungen.",
|
||||
"test_webhook_sent": "Slack-Test gesendet",
|
||||
"test_webhook_sent_success": "Die Slack-Testnachricht fuer Kundenregistrierungen wurde gesendet.",
|
||||
"title": "Slack-Konfiguration",
|
||||
"unavailable": "Die Slack-Konfiguration ist in dieser API-Version nicht verfuegbar."
|
||||
},
|
||||
|
||||
@@ -2169,12 +2169,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack webhook that receives a message when a new customer registration succeeds. Leave empty to disable.",
|
||||
"notification_settings": "Notification settings",
|
||||
"notification_settings_desc": "Slack webhooks for system events.",
|
||||
"send_test_webhook": "Send test webhook",
|
||||
"subtitle": "Configuration of Slack notifications",
|
||||
"test_webhook_error": "Could not send the Slack test webhook.",
|
||||
"test_webhook_not_configured": "Save a customer registration webhook URL before sending a test.",
|
||||
"test_webhook_sent": "Slack test sent",
|
||||
"test_webhook_sent_success": "The Slack customer registration test message was sent.",
|
||||
"title": "Slack configuration",
|
||||
"unavailable": "Slack configuration is not available on this API release."
|
||||
},
|
||||
|
||||
@@ -2496,12 +2496,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack-webhook som får ett meddelande när en ny kundregistrering lyckas. Lämna tomt för att inaktivera.",
|
||||
"notification_settings": "Aviseringsinställningar",
|
||||
"notification_settings_desc": "Slack-webhooks för systemhändelser.",
|
||||
"send_test_webhook": "Skicka test-webhook",
|
||||
"subtitle": "Konfiguration av Slack-aviseringar",
|
||||
"test_webhook_error": "Det gick inte att skicka Slack-testwebhooken.",
|
||||
"test_webhook_not_configured": "Spara en webhook-URL för kundregistreringar innan du skickar ett test.",
|
||||
"test_webhook_sent": "Slack-test skickat",
|
||||
"test_webhook_sent_success": "Slack-testmeddelandet för kundregistrering skickades.",
|
||||
"title": "Slack-konfiguration",
|
||||
"unavailable": "Slack-konfigurationen är inte tillgänglig i den här API-versionen."
|
||||
},
|
||||
|
||||
@@ -163,12 +163,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack-webhook der modtager en besked, når en ny kunderegistrering lykkes. Lad feltet være tomt for at deaktivere.",
|
||||
"notification_settings": "Notifikationer",
|
||||
"notification_settings_desc": "Slack-webhooks til systemhændelser.",
|
||||
"send_test_webhook": "Send test-webhook",
|
||||
"subtitle": "Konfiguration af Slack-notifikationer",
|
||||
"test_webhook_error": "Kunne ikke sende Slack-testwebhooken.",
|
||||
"test_webhook_not_configured": "Gem en webhook-URL til kunderegistreringer, før du sender en test.",
|
||||
"test_webhook_sent": "Slack-test sendt",
|
||||
"test_webhook_sent_success": "Slack-testbeskeden for kunderegistrering blev sendt.",
|
||||
"title": "Slack-konfiguration",
|
||||
"unavailable": "Slack-konfigurationen er ikke tilgængelig i denne API-udgivelse."
|
||||
},
|
||||
|
||||
@@ -163,12 +163,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack-Webhook, der eine Nachricht erhaelt, wenn eine neue Kundenregistrierung erfolgreich ist. Leer lassen, um dies zu deaktivieren.",
|
||||
"notification_settings": "Benachrichtigungseinstellungen",
|
||||
"notification_settings_desc": "Slack-Webhooks fuer Systemereignisse.",
|
||||
"send_test_webhook": "Test-Webhook senden",
|
||||
"subtitle": "Konfiguration von Slack-Benachrichtigungen",
|
||||
"test_webhook_error": "Der Slack-Test-Webhook konnte nicht gesendet werden.",
|
||||
"test_webhook_not_configured": "Speichern Sie zuerst eine Webhook-URL fuer Kundenregistrierungen.",
|
||||
"test_webhook_sent": "Slack-Test gesendet",
|
||||
"test_webhook_sent_success": "Die Slack-Testnachricht fuer Kundenregistrierungen wurde gesendet.",
|
||||
"title": "Slack-Konfiguration",
|
||||
"unavailable": "Die Slack-Konfiguration ist in dieser API-Version nicht verfuegbar."
|
||||
},
|
||||
|
||||
@@ -163,12 +163,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack webhook that receives a message when a new customer registration succeeds. Leave empty to disable.",
|
||||
"notification_settings": "Notification settings",
|
||||
"notification_settings_desc": "Slack webhooks for system events.",
|
||||
"send_test_webhook": "Send test webhook",
|
||||
"subtitle": "Configuration of Slack notifications",
|
||||
"test_webhook_error": "Could not send the Slack test webhook.",
|
||||
"test_webhook_not_configured": "Save a customer registration webhook URL before sending a test.",
|
||||
"test_webhook_sent": "Slack test sent",
|
||||
"test_webhook_sent_success": "The Slack customer registration test message was sent.",
|
||||
"title": "Slack configuration",
|
||||
"unavailable": "Slack configuration is not available on this API release."
|
||||
},
|
||||
|
||||
@@ -163,12 +163,7 @@
|
||||
"customer_registration_webhook_url_desc": "Slack-webhook som får ett meddelande när en ny kundregistrering lyckas. Lämna tomt för att inaktivera.",
|
||||
"notification_settings": "Aviseringsinställningar",
|
||||
"notification_settings_desc": "Slack-webhooks för systemhändelser.",
|
||||
"send_test_webhook": "Skicka test-webhook",
|
||||
"subtitle": "Konfiguration av Slack-aviseringar",
|
||||
"test_webhook_error": "Det gick inte att skicka Slack-testwebhooken.",
|
||||
"test_webhook_not_configured": "Spara en webhook-URL för kundregistreringar innan du skickar ett test.",
|
||||
"test_webhook_sent": "Slack-test skickat",
|
||||
"test_webhook_sent_success": "Slack-testmeddelandet för kundregistrering skickades.",
|
||||
"title": "Slack-konfiguration",
|
||||
"unavailable": "Slack-konfigurationen är inte tillgänglig i den här API-versionen."
|
||||
},
|
||||
|
||||
+2
@@ -40,6 +40,7 @@ const currentRoute = useRoute();
|
||||
const currentRouter = useRouter();
|
||||
const toast = useAppToast();
|
||||
const { fitView, getViewport, zoomIn, zoomOut, zoomTo } = useVueFlow({ id: "self-serve-studio-flow" });
|
||||
const PATH_OUTCOMES_CASE_LIMIT = 2048;
|
||||
|
||||
const parseIntOrZero = (value) => {
|
||||
const parsed = Number.parseInt(value, 10);
|
||||
@@ -899,6 +900,7 @@ const pathOutcomesRequestPayload = computed(() => {
|
||||
config_source: simulatorForm.value.config_source || "draft",
|
||||
hardware_mode: hardwareMode,
|
||||
include_hardware: hardwareMode !== "none",
|
||||
path_sample_limit: PATH_OUTCOMES_CASE_LIMIT,
|
||||
};
|
||||
});
|
||||
const syncScopeFromRoute = () => {
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
import Swal from "sweetalert2";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import PageTitle from "@/components/global/PageTitle.vue";
|
||||
import ConfigurationCategory from "@/components/displays/superuser/configuration/ConfigurationCategory.vue";
|
||||
import ConfigurationInput from "@/components/displays/superuser/configuration/ConfigurationInput.vue";
|
||||
@@ -9,11 +7,9 @@ import RestrictedPageWrapper from "@/components/page/wrappers/RestrictedPageWrap
|
||||
import { SessionUser } from "@/components/session/token/SessionUser.vue";
|
||||
import ConfigurationSubPageWrapper from "@/views/dashboards/superUserDashboard/configuration/ConfigurationSubPageWrapper.vue";
|
||||
|
||||
const { t } = useI18n();
|
||||
const module_config = ref([]);
|
||||
const module_config_unavailable = ref(false);
|
||||
const module_config_forbidden = ref(false);
|
||||
const is_testing_webhook = ref(false);
|
||||
|
||||
const getRequestStatus = (error) => Number.parseInt(String(error?.response?.status ?? error?.status ?? ""), 10);
|
||||
|
||||
@@ -55,38 +51,6 @@ const getModuleConfigValue = (variable) => {
|
||||
return config ? config.value : "";
|
||||
};
|
||||
|
||||
const testCustomerRegistrationWebhook = async () => {
|
||||
if (is_testing_webhook.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
is_testing_webhook.value = true;
|
||||
try {
|
||||
await SessionUser.superUser.modules.slack.config.test_customer_registration_webhook();
|
||||
await Swal.fire({
|
||||
title: t("configuration.slack.test_webhook_sent"),
|
||||
text: t("configuration.slack.test_webhook_sent_success"),
|
||||
icon: "success",
|
||||
});
|
||||
} catch (error) {
|
||||
const status = getRequestStatus(error);
|
||||
let text = t("configuration.slack.test_webhook_error");
|
||||
if (status === 400) {
|
||||
text = t("configuration.slack.test_webhook_not_configured");
|
||||
} else if (status === 403) {
|
||||
text = t("errors.forbidden");
|
||||
}
|
||||
|
||||
await Swal.fire({
|
||||
title: t("common.error"),
|
||||
text,
|
||||
icon: "error",
|
||||
});
|
||||
} finally {
|
||||
is_testing_webhook.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
getModuleConfig();
|
||||
</script>
|
||||
|
||||
@@ -113,19 +77,6 @@ getModuleConfig();
|
||||
:value="getModuleConfigValue('customer_registration_webhook_url')"
|
||||
:on-save="SessionUser.superUser.modules.slack.config.keys.customer_registration_webhook_url.set"
|
||||
/>
|
||||
<button
|
||||
class="button is-dark mt-2"
|
||||
type="button"
|
||||
data-testid="slack-test-webhook-button"
|
||||
:class="{ 'is-loading': is_testing_webhook }"
|
||||
:disabled="is_testing_webhook"
|
||||
@click="testCustomerRegistrationWebhook"
|
||||
>
|
||||
<span class="icon">
|
||||
<i class="fab fa-slack" aria-hidden="true"></i>
|
||||
</span>
|
||||
<span>{{ $t("configuration.slack.send_test_webhook") }}</span>
|
||||
</button>
|
||||
</ConfigurationCategory>
|
||||
</template>
|
||||
<template v-else-if="module_config_unavailable" #content>
|
||||
|
||||
@@ -2963,6 +2963,7 @@ test.describe("All-in-one self-serve studio", () => {
|
||||
await expect
|
||||
.poll(() => Object.prototype.hasOwnProperty.call(captured.pathOutcomes[0] || {}, "max_states"))
|
||||
.toBe(false);
|
||||
await expect.poll(() => captured.pathOutcomes[0]?.path_sample_limit).toBe(2048);
|
||||
await expect(page.getByTestId("studio-path-outcomes-error")).toHaveCount(0);
|
||||
await expect(page.getByTestId("studio-path-outcomes-summary")).toContainText("2");
|
||||
await expect(page.getByTestId("studio-path-outcome-detail")).toContainText("MACHINE");
|
||||
|
||||
@@ -150,6 +150,8 @@ describe("self-serve studio task editing", () => {
|
||||
"const machineStartPathResultList = computed(() => pathResultList.value.filter(pathCaseShowsMachineStartTask))"
|
||||
);
|
||||
expect(source).toContain("const pathCaseList = computed(() => machineStartPathResultList.value)");
|
||||
expect(source).toContain("const PATH_OUTCOMES_CASE_LIMIT = 2048");
|
||||
expect(source).toContain("path_sample_limit: PATH_OUTCOMES_CASE_LIMIT");
|
||||
expect(source).toContain('data-testid="studio-path-hidden-non-machine-start-cases"');
|
||||
});
|
||||
|
||||
|
||||
@@ -32,8 +32,6 @@ describe("slack module contract", () => {
|
||||
it("uses Slack config endpoints and customer registration variable", () => {
|
||||
expect(slackConfigSource).toContain('"/slack/config?variable=" + variable');
|
||||
expect(slackConfigSource).toContain('"/slack/config"');
|
||||
expect(slackConfigSource).toContain('"/slack/config/test"');
|
||||
expect(slackConfigSource).toContain("test_customer_registration_webhook");
|
||||
expect(slackConfigSource).toContain('Config.get("customer_registration_webhook_url")');
|
||||
expect(slackConfigSource).toContain('Config.set("customer_registration_webhook_url", value)');
|
||||
});
|
||||
@@ -53,18 +51,6 @@ describe("slack module contract", () => {
|
||||
expect(slackPageSource).toContain(
|
||||
':on-save="SessionUser.superUser.modules.slack.config.keys.customer_registration_webhook_url.set"'
|
||||
);
|
||||
expect(slackPageSource).toContain("testCustomerRegistrationWebhook");
|
||||
expect(slackPageSource).toContain(
|
||||
"SessionUser.superUser.modules.slack.config.test_customer_registration_webhook()"
|
||||
);
|
||||
expect(slackPageSource).toContain('data-testid="slack-test-webhook-button"');
|
||||
expect(slackPageSource).toContain(":class=\"{ 'is-loading': is_testing_webhook }\"");
|
||||
expect(slackPageSource).toContain(':disabled="is_testing_webhook"');
|
||||
expect(slackPageSource).toContain('$t("configuration.slack.send_test_webhook")');
|
||||
expect(slackPageSource).toContain('t("configuration.slack.test_webhook_sent")');
|
||||
expect(slackPageSource).toContain('t("configuration.slack.test_webhook_sent_success")');
|
||||
expect(slackPageSource).toContain('t("configuration.slack.test_webhook_not_configured")');
|
||||
expect(slackPageSource).toContain('t("configuration.slack.test_webhook_error")');
|
||||
});
|
||||
|
||||
it("shows an unavailable state when the API release does not expose Slack config", () => {
|
||||
|
||||
Reference in New Issue
Block a user