Skip to content

Integration Tests

Integration Tests #394

name: Integration Tests
on:
workflow_call:
secrets:
GH_APP_CREDS:
required: true
PAT:
required: true
workflow_dispatch:
permissions: {}
jobs:
integration-tests:
name: Integration Test
runs-on: ubuntu-latest
environment:
name: integration-tests
deployment: false
strategy:
fail-fast: false
matrix:
include:
- auth: PAT
owner: dsanders11
project_number: 11
- auth: PAT
owner: dsanders11-playground-org
project_number: 2
- auth: GHA
owner: dsanders11-playground-org
project_number: 2
steps:
- name: Checkout
id: checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Get Date
uses: ./github-script/
id: get-date
with:
result-encoding: string
script: |
return new Date().toISOString()
- name: Generate GitHub App Token
uses: electron/github-app-auth-action@e14e47722ed120360649d0789e25b9baece12725 # v2.0.0
id: generate-app-token
if: ${{ matrix.auth == 'GHA' }}
with:
creds: ${{ secrets.GH_APP_CREDS }}
org: ${{ matrix.owner }}
- name: Get Auth Token
id: get-auth-token
env:
GHA_TOKEN: ${{ steps.generate-app-token.outputs.token }}
PAT: ${{ secrets.PAT }}
run: |
if [[ -n "$GHA_TOKEN" ]]; then
echo "token=$GHA_TOKEN" >> "$GITHUB_OUTPUT"
else
echo "token=$PAT" >> "$GITHUB_OUTPUT"
fi
- name: Create Template View
uses: ./github-script/
id: template-view
with:
script: |
return {
"type": "Favorite",
"foo": "bar"
}
- name: Copy Project
uses: ./copy-project/
id: copy-project
with:
drafts: true
owner: ${{ matrix.owner }}
project-number: ${{ matrix.project_number }}
# public: true
target-owner: ${{ matrix.owner }}
template-view: ${{ steps.template-view.outputs.result }}
title: Integration Test Project
token: ${{ steps.get-auth-token.outputs.token }}
- name: Get Draft Issue ID
id: get-draft-issue-id
run: |
set -eo pipefail
echo "id=$(gh project item-list ${PROJECT_NUMBER} --owner ${OWNER} --format json | jq -r '.items[0] | .id')" >> "$GITHUB_OUTPUT"
env:
PROJECT_NUMBER: ${{ steps.copy-project.outputs.number }}
OWNER: ${{ steps.copy-project.outputs.owner }}
GH_TOKEN: ${{ steps.get-auth-token.outputs.token }}
- name: Get Draft Issue
uses: ./get-item/
id: get-draft-issue
with:
field: Priority
item: ${{ steps.get-draft-issue-id.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
# Upstream needs to fix https://github.com/cli/cli/issues/12726
#
# - name: Edit Draft Issue Title
# uses: ./edit-item/
# id: edit-draft-issue-title
# with:
# item: ${{ steps.get-draft-issue.outputs.id }}
# owner: ${{ steps.copy-project.outputs.owner }}
# project-number: ${{ steps.copy-project.outputs.number }}
# token: ${{ steps.get-auth-token.outputs.token }}
# title: New Draft Issue Title
- name: Edit Draft Issue Assignees
uses: ./edit-item/
id: edit-draft-issue-assignees
with:
assignees: dsanders11
item: ${{ steps.get-draft-issue.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Get Draft Issue (again)
uses: ./get-item/
id: get-draft-issue-again
with:
field: Priority
item: ${{ steps.get-draft-issue-id.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Draft Issue Assignees
uses: ./github-script/
env:
ASSIGNEES: ${{ steps.get-draft-issue-again.outputs.assignees }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.ASSIGNEES, 'dsanders11');
- name: Run Completed By
uses: ./completed-by/
id: completed-by
with:
field-value: Done
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Draft Issue Is Completed
uses: ./github-script/
env:
ITEM_ID: ${{ steps.get-draft-issue-id.outputs.id }}
OWNER: ${{ steps.copy-project.outputs.owner }}
PROJECT_NUMBER: ${{ steps.copy-project.outputs.number }}
with:
script: |
const assert = require('node:assert');
const item = await actions.getItem(
process.env.OWNER,
process.env.PROJECT_NUMBER,
process.env.ITEM_ID,
'Status'
)
assert.strictEqual(item.field?.value, 'Done');
token: ${{ steps.get-auth-token.outputs.token }}
- name: Add Item
uses: ./add-item/
id: add-item
with:
content-url: https://github.com/dsanders11/project-actions/pull/2
field: Added
field-value: ${{ steps.get-date.outputs.result }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
# HACK - This is a workaround for a GitHub change in behavior
# where the item is not immediately available after creation
- name: Sleep (Wait for Item to be Added)
run: sleep 5
- name: Get Added Item
uses: ./get-item/
id: get-added-item
with:
field: Added
item: ${{ steps.add-item.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Added Item
uses: ./github-script/
env:
DATE_STRING: ${{ steps.get-date.outputs.result }}
FIELD_VALUE: ${{ steps.get-added-item.outputs.field-value }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.FIELD_VALUE, new Date(process.env.DATE_STRING).toISOString().split('T')[0]);
- name: Edit Item Assignees
uses: ./edit-item/
id: edit-item-assignees
if: ${{ matrix.owner == 'dsanders11-playground-org' && matrix.auth != 'GHA' }}
with:
assignees: dsanders11
item: ${{ steps.get-added-item.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Get Item After Assignee Edit
uses: ./get-item/
id: get-item-after-assignee-edit
if: ${{ matrix.owner == 'dsanders11-playground-org' && matrix.auth != 'GHA' }}
with:
item: ${{ steps.get-added-item.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Assignees After Edit
uses: ./github-script/
if: ${{ matrix.owner == 'dsanders11-playground-org' && matrix.auth != 'GHA' }}
env:
ASSIGNEES: ${{ steps.get-item-after-assignee-edit.outputs.assignees }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.ASSIGNEES, 'dsanders11');
- name: Edit Item
uses: ./edit-item/
id: edit-item
with:
field: Priority
field-value: ⛰️ High
item: ${{ steps.get-added-item.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Edit Item (Not Found)
uses: ./edit-item/
id: edit-item-not-found
with:
fail-if-item-not-found: false
field: Priority
field-value: ⛰️ High
item: foobar
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Get Item
uses: ./get-item/
id: get-edited-item
with:
field: Priority
item: ${{ steps.edit-item.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Get Item (Not Found)
uses: ./get-item/
id: get-item-not-found
with:
fail-if-item-not-found: false
field: Priority
item: foobar
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Edited Item Field Value
uses: ./github-script/
env:
FIELD_VALUE: ${{ steps.get-edited-item.outputs.field-value }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.FIELD_VALUE, '⛰️ High');
- name: Test GitHub Script Action
uses: ./github-script/
env:
ITEM_ID: ${{ steps.edit-item.outputs.id }}
PROJECT_ID: ${{ steps.copy-project.outputs.id }}
PROJECT_NUMBER: ${{ steps.copy-project.outputs.number }}
OWNER: ${{ steps.copy-project.outputs.owner }}
with:
token: ${{ steps.get-auth-token.outputs.token }}
script: |
const assert = require('node:assert');
const item = await actions.getItem(
process.env.OWNER,
process.env.PROJECT_NUMBER,
process.env.ITEM_ID,
'Priority'
);
const items = await actions.getAllItems(process.env.PROJECT_ID);
assert.strictEqual(item.field?.value, '⛰️ High');
assert.strictEqual(items.length, 2, 'Expected 2 items');
- name: Test GitHub Script Action (Assignees)
uses: ./github-script/
env:
ITEM_ID: ${{ steps.get-draft-issue.outputs.id }}
PROJECT_ID: ${{ steps.copy-project.outputs.id }}
PROJECT_NUMBER: ${{ steps.copy-project.outputs.number }}
OWNER: ${{ steps.copy-project.outputs.owner }}
with:
token: ${{ steps.get-auth-token.outputs.token }}
script: |
const assert = require('node:assert');
let item = await actions.getItem(
process.env.OWNER,
process.env.PROJECT_NUMBER,
process.env.ITEM_ID,
);
await actions.editItem(process.env.PROJECT_ID, item.content.id, {
assignees: ['dsanders11'],
});
// Verify assignees were set by re-fetching the item
item = await actions.getItem(
process.env.OWNER,
process.env.PROJECT_NUMBER,
process.env.ITEM_ID,
);
const logins = item.content.assignees.nodes.map(a => a.login);
assert.ok(logins.includes('dsanders11'), 'Expected dsanders11 to be an assignee');
# - name: Archive Item
# uses: ./archive-item/
# id: archive-item
# with:
# item: ${{ steps.add-item.outputs.id }}
# owner: ${{ steps.copy-project.outputs.owner }}
# project-number: ${{ steps.copy-project.outputs.number }}
# token: ${{ steps.get-auth-token.outputs.token }}
# - name: Unarchive Item
# uses: ./archive-item/
# id: unarchive-item
# with:
# archived: false
# item: ${{ steps.add-item.outputs.id }}
# owner: ${{ steps.copy-project.outputs.owner }}
# project-number: ${{ steps.copy-project.outputs.number }}
# token: ${{ steps.get-auth-token.outputs.token }}
- name: Delete Item
uses: ./delete-item/
id: delete-item
with:
item: ${{ steps.edit-item.outputs.id }}
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Delete Item (Not Found)
uses: ./delete-item/
id: delete-item-not-found
with:
item: foobar
fail-if-item-not-found: false
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Link Project to Repository
uses: ./link-project/
id: link-project-to-repo
if: ${{ matrix.owner == 'dsanders11' }}
with:
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
repository: dsanders11/project-actions
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Project is Linked to Repository
uses: ./github-script/
if: ${{ matrix.owner == 'dsanders11' }}
env:
PROJECT_ID: ${{ steps.copy-project.outputs.id }}
REPOSITORY_ID: ${{ steps.link-project-to-repo.outputs.repository-id }}
with:
token: ${{ steps.get-auth-token.outputs.token }}
script: |
const assert = require('node:assert');
const { projectV2 } = await github.graphql(
`query getProjectLinkedRepos($projectId: ID!) {
projectV2: node(id: $projectId) {
... on ProjectV2 {
id
repositories(first: 10) {
nodes {
id
nameWithOwner
}
}
}
}
}`,
{ projectId: process.env.PROJECT_ID }
);
assert.strictEqual(projectV2.repositories.nodes.length, 1, 'Expected one linked repository');
assert.strictEqual(projectV2.repositories.nodes[0].nameWithOwner, 'dsanders11/project-actions', 'Project not linked to repository');
assert.strictEqual(projectV2.repositories.nodes[0].id, process.env.REPOSITORY_ID, `Output 'repository-id' is not as expected`);
- name: Link Project to Team
uses: ./link-project/
id: link-project-to-team
if: ${{ matrix.owner == 'dsanders11-playground-org' }}
with:
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
team: dsanders11-playground-org/maintainers
token: ${{ steps.get-auth-token.outputs.token }}
# HACK - Sometimes the linking isn't immediately reflected
- name: Sleep (Wait for Project to be Linked)
run: sleep 5
- name: Check Project is Linked to Team
uses: ./github-script/
if: ${{ matrix.owner == 'dsanders11-playground-org' }}
env:
PROJECT_ID: ${{ steps.copy-project.outputs.id }}
TEAM_ID: ${{ steps.link-project-to-team.outputs.team-id }}
with:
token: ${{ steps.get-auth-token.outputs.token }}
script: |
const assert = require('node:assert');
const { projectV2 } = await github.graphql(
`query getProjectLinkedRepos($projectId: ID!) {
projectV2: node(id: $projectId) {
... on ProjectV2 {
id
teams(first: 10) {
nodes {
id
name
}
}
}
}
}`,
{ projectId: process.env.PROJECT_ID }
);
assert.strictEqual(projectV2.teams.nodes.length, 1, 'Expected one linked team');
assert.strictEqual(projectV2.teams.nodes[0].name, 'maintainers', 'Project not linked to team');
assert.strictEqual(projectV2.teams.nodes[0].id, process.env.TEAM_ID, `Output 'team-id' is not as expected`);
- name: Edit Project
uses: ./edit-project/
id: edit-project
with:
description: New Description
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
readme: This is the readme
title: New Title ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Find Project
uses: ./find-project/
id: find-project
with:
owner: ${{ matrix.owner }}
title: New Title ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Find Project (Not Found)
uses: ./find-project/
id: find-project-not-found
with:
fail-if-project-not-found: false
owner: ${{ matrix.owner }}
title: Foobar
token: ${{ steps.get-auth-token.outputs.token }}
- name: Confirm Project Found
uses: ./github-script/
env:
ACTUAL_PROJECT_NUMBER: ${{ steps.copy-project.outputs.number }}
EXPECTED_PROJECT_NUMBER: ${{ steps.find-project.outputs.number }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.ACTUAL_PROJECT_NUMBER, process.env.EXPECTED_PROJECT_NUMBER, 'Expect to find project by title');
token: ${{ steps.get-auth-token.outputs.token }}
- name: Get Project
uses: ./get-project/
id: get-project
with:
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Project Values
uses: ./github-script/
env:
DESCRIPTION: ${{ steps.get-project.outputs.description }}
PROJECT_NUMBER: ${{ steps.copy-project.outputs.number }}
README: ${{ steps.get-project.outputs.readme }}
TITLE: ${{ steps.get-project.outputs.title }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.TITLE, `New Title ${process.env.PROJECT_NUMBER}`);
assert.strictEqual(process.env.DESCRIPTION, 'New Description');
assert.strictEqual(process.env.README, 'This is the readme');
- name: Find Workflow
uses: ./find-workflow/
id: find-workflow
with:
owner: ${{ matrix.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
name: 'Item closed'
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Workflow Values
uses: ./github-script/
env:
ACTUAL_PROJECT_ID: ${{ steps.find-workflow.outputs.project-id }}
EXPECTED_PROJECT_ID: ${{ steps.get-project.outputs.id }}
WORKFLOW_ENABLED: ${{ steps.find-workflow.outputs.enabled }}
WORKFLOW_NAME: ${{ steps.find-workflow.outputs.name }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.WORKFLOW_NAME, 'Item closed');
assert.strictEqual(process.env.WORKFLOW_ENABLED, 'true');
assert.strictEqual(process.env.ACTUAL_PROJECT_ID, process.env.EXPECTED_PROJECT_ID);
- name: Get Workflow
uses: ./get-workflow/
id: get-workflow
with:
owner: ${{ matrix.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
number: ${{ steps.find-workflow.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Check Workflow Values
uses: ./github-script/
env:
ACTUAL_PROJECT_ID: ${{ steps.get-workflow.outputs.project-id }}
ACTUAL_WORKFLOW_ID: ${{ steps.get-workflow.outputs.id }}
ACTUAL_WORKFLOW_NUMBER: ${{ steps.get-workflow.outputs.number }}
EXPECTED_PROJECT_ID: ${{ steps.get-project.outputs.id }}
EXPECTED_WORKFLOW_ID: ${{ steps.find-workflow.outputs.id }}
EXPECTED_WORKFLOW_NUMBER: ${{ steps.find-workflow.outputs.number }}
WORKFLOW_ENABLED: ${{ steps.get-workflow.outputs.enabled }}
WORKFLOW_NAME: ${{ steps.get-workflow.outputs.name }}
with:
script: |
const assert = require('node:assert');
assert.strictEqual(process.env.ACTUAL_WORKFLOW_ID, process.env.EXPECTED_WORKFLOW_ID);
assert.strictEqual(process.env.WORKFLOW_NAME, 'Item closed');
assert.strictEqual(process.env.ACTUAL_WORKFLOW_NUMBER, process.env.EXPECTED_WORKFLOW_NUMBER);
assert.strictEqual(process.env.WORKFLOW_ENABLED, 'true');
assert.strictEqual(process.env.ACTUAL_PROJECT_ID, process.env.EXPECTED_PROJECT_ID);
- name: Close Project
uses: ./close-project/
id: close-project
with:
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Close Project (Not Found)
uses: ./close-project/
id: close-project-not-found
with:
fail-if-project-not-found: false
owner: ${{ steps.copy-project.outputs.owner }}
project-number: 99999
token: ${{ steps.get-auth-token.outputs.token }}
- name: Find Closed Project
uses: ./find-project/
id: find-closed-project
with:
owner: ${{ steps.copy-project.outputs.owner }}
title: ${{ steps.find-project.outputs.title }}
include-closed: true
token: ${{ steps.get-auth-token.outputs.token }}
- name: Reopen Project
uses: ./close-project/
id: reopen-project
with:
closed: false
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Delete Project
uses: ./delete-project/
id: delete-project
with:
owner: ${{ steps.copy-project.outputs.owner }}
project-number: ${{ steps.copy-project.outputs.number }}
token: ${{ steps.get-auth-token.outputs.token }}
- name: Delete Project (Not Found)
uses: ./delete-project/
id: delete-project-not-found
with:
fail-if-project-not-found: false
owner: ${{ steps.copy-project.outputs.owner }}
project-number: 99999
token: ${{ steps.get-auth-token.outputs.token }}
- name: Test github-script
uses: ./github-script/
with:
script: |
const assert = require('node:assert');
const { data: repo } = await github.rest.repos.get({
owner: 'dsanders11',
repo: 'project-actions',
});
assert.strictEqual(repo.full_name, 'dsanders11/project-actions');
assert.strictEqual(repo.private, false);