2024-09-11 22:34:33 +02:00
// @watch start
// templates/repo/actions/**
// web_src/css/actions.css
// web_src/js/components/ActionRunStatus.vue
// web_src/js/components/RepoActionView.vue
// modules/actions/**
// modules/structs/workflow.go
// routers/api/v1/repo/action.go
// routers/web/repo/actions/**
// @watch end
2024-08-14 23:34:36 +02:00
import { expect } from '@playwright/test' ;
2024-11-08 09:55:54 +01:00
import { test , login_user , load_logged_in_context } from './utils_e2e.ts' ;
2024-06-28 07:17:11 +02:00
test . beforeAll ( async ( { browser } , workerInfo ) = > {
await login_user ( browser , workerInfo , 'user2' ) ;
} ) ;
2024-11-10 02:50:20 +01:00
test ( 'Markdown image preview behaviour' , async ( { browser } , workerInfo ) = > {
const page = await login ( { browser } , workerInfo ) ;
const editPath = '/user2/repo1/src/branch/master/README.md'
const response = await page . goto ( editPath ) ;
expect ( response ? . status ( ) ) . toBe ( 200 ) ;
await page . locator ( '[data-tooltip-content="Edit file"]' ) . click ( ) ;
await page . waitForLoadState ( 'networkidle' ) ;
const editor = await page . locator ( '[aria-roledescription="editor"]' ) . first ( ) ;
await editor . fill ( '' ) ;
await editor . fill ( '![Logo of Forgejo](./assets/logo.svg "Logo of Forgejo")' ) ;
await page . locator ( 'a[data-tab="preview"]' ) . click ( ) ;
await page . waitForLoadState ( 'networkidle' ) ;
const preview = await page . locator ( 'div[data-tab="preview"] p[dir="auto"] a' )
await expect ( preview ) . toHaveAttribute ( 'href' , 'http://localhost:3003/user2/repo1/media/branch/master/assets/logo.svg' ) ;
} ) ;
2024-07-06 07:30:58 +02:00
const workflow_trigger_notification_text = 'This workflow has a workflow_dispatch event trigger.' ;
2024-07-22 20:03:32 +02:00
test ( 'workflow dispatch present' , async ( { browser } , workerInfo ) = > {
2024-06-28 07:17:11 +02:00
const context = await load_logged_in_context ( browser , workerInfo , 'user2' ) ;
const page = await context . newPage ( ) ;
await page . goto ( '/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0' ) ;
2024-07-06 07:30:58 +02:00
await expect ( page . getByText ( workflow_trigger_notification_text ) ) . toBeVisible ( ) ;
2024-06-28 07:17:11 +02:00
const run_workflow_btn = page . locator ( '#workflow_dispatch_dropdown>button' ) ;
await expect ( run_workflow_btn ) . toBeVisible ( ) ;
const menu = page . locator ( '#workflow_dispatch_dropdown>.menu' ) ;
await expect ( menu ) . toBeHidden ( ) ;
await run_workflow_btn . click ( ) ;
await expect ( menu ) . toBeVisible ( ) ;
} ) ;
2024-07-22 20:03:32 +02:00
test ( 'workflow dispatch error: missing inputs' , async ( { browser } , workerInfo ) = > {
2024-06-28 07:17:11 +02:00
test . skip ( workerInfo . project . name === 'Mobile Safari' , 'Flaky behaviour on mobile safari; see https://codeberg.org/forgejo/forgejo/pulls/3334#issuecomment-2033383' ) ;
const context = await load_logged_in_context ( browser , workerInfo , 'user2' ) ;
const page = await context . newPage ( ) ;
await page . goto ( '/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0' ) ;
await page . locator ( '#workflow_dispatch_dropdown>button' ) . click ( ) ;
// Remove the required attribute so we can trigger the error message!
await page . evaluate ( ( ) = > {
const elem = document . querySelector ( 'input[name="inputs[string2]"]' ) ;
elem ? . removeAttribute ( 'required' ) ;
} ) ;
await page . locator ( '#workflow-dispatch-submit' ) . click ( ) ;
await expect ( page . getByText ( 'Require value for input "String w/o. default".' ) ) . toBeVisible ( ) ;
} ) ;
2024-07-22 20:03:32 +02:00
test ( 'workflow dispatch success' , async ( { browser } , workerInfo ) = > {
2024-06-28 07:17:11 +02:00
test . skip ( workerInfo . project . name === 'Mobile Safari' , 'Flaky behaviour on mobile safari; see https://codeberg.org/forgejo/forgejo/pulls/3334#issuecomment-2033383' ) ;
const context = await load_logged_in_context ( browser , workerInfo , 'user2' ) ;
const page = await context . newPage ( ) ;
await page . goto ( '/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0' ) ;
await page . locator ( '#workflow_dispatch_dropdown>button' ) . click ( ) ;
2024-11-15 01:41:55 +01:00
await page . fill ( 'input[name="inputs[string2]"]' , 'abc' ) ;
2024-06-28 07:17:11 +02:00
await page . locator ( '#workflow-dispatch-submit' ) . click ( ) ;
await expect ( page . getByText ( 'Workflow run was successfully requested.' ) ) . toBeVisible ( ) ;
await expect ( page . locator ( '.run-list>:first-child .run-list-meta' , { hasText : 'now' } ) ) . toBeVisible ( ) ;
} ) ;
2024-07-06 07:30:58 +02:00
2024-07-22 20:03:32 +02:00
test ( 'workflow dispatch box not available for unauthenticated users' , async ( { page } ) = > {
2024-07-06 07:30:58 +02:00
await page . goto ( '/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0' ) ;
await expect ( page . locator ( 'body' ) ) . not . toContainText ( workflow_trigger_notification_text ) ;
} ) ;