Files
first-interaction/__tests__/main.test.ts
2025-09-16 13:00:00 -04:00

295 lines
6.7 KiB
TypeScript

import { jest } from '@jest/globals'
import * as core from '../__fixtures__/@actions/core.js'
import * as github from '../__fixtures__/@actions/github.js'
import * as octokit from '../__fixtures__/@octokit/rest.js'
jest.unstable_mockModule('@actions/core', () => core)
jest.unstable_mockModule('@actions/github', () => github)
jest.unstable_mockModule('@octokit/rest', async () => {
class Octokit {
constructor() {
return octokit
}
}
return {
Octokit
}
})
const main = await import('../src/main.js')
const { Octokit } = await import('@octokit/rest')
const mocktokit = jest.mocked(new Octokit())
describe('main.ts', () => {
afterEach(() => {
jest.resetAllMocks()
})
beforeEach(() => {
// "Reset" the github context.
github.context.eventName = 'pull_request'
github.context.payload.action = 'opened'
github.context.payload.issue = undefined as any
github.context.payload.pull_request = {
number: 10
}
github.context.payload.sender = {
login: 'mona'
}
// Set the action's inputs as return values from core.getInput().
core.getInput
.mockReturnValueOnce('ISSUE_MESSAGE')
.mockReturnValueOnce('PR_MESSAGE')
.mockReturnValueOnce('REPO_TOKEN')
})
describe('run()', () => {
it('Skips invalid events', async () => {
github.context.eventName = 'push'
github.context.payload = {} as any
await main.run()
expect(core.info).toHaveBeenCalledWith('Skipping...Not an Issue/PR Event')
})
it('Skips invalid actions', async () => {
github.context.payload.action = 'edited'
await main.run()
expect(core.info).toHaveBeenCalledWith('Skipping...Not an Opened Event')
})
it('Fails if no sender is present', async () => {
github.context.payload.sender = undefined as any
await main.run()
expect(core.setFailed).toHaveBeenCalledWith(
'Internal Error...No Sender Provided by GitHub'
)
})
it('Fails if both PR and issue are provided', async () => {
github.context.payload.issue = {
number: 20
}
github.context.payload.pull_request = {
number: 10
}
await main.run()
expect(core.setFailed).toHaveBeenCalledWith(
'Internal Error...Both Issue and PR Provided by GitHub'
)
})
it('Skips adding a message if this is not the first contribution', async () => {
mocktokit.paginate
// Issues
.mockResolvedValueOnce([
{
number: 10
},
{
number: 5
}
])
// PRs
.mockResolvedValueOnce([
{
number: 3
}
])
await main.run()
expect(core.info).toHaveBeenCalledWith(
'Skipping...Not First Contribution'
)
expect(mocktokit.rest.issues.createComment).not.toHaveBeenCalled()
})
it('Adds an issue message if this is the first contribution', async () => {
github.context.payload.issue = {
number: 10
}
github.context.payload.pull_request = undefined as any
mocktokit.paginate
// Issues
.mockResolvedValueOnce([
{
number: 10
}
])
// PRs
.mockResolvedValueOnce([])
await main.run()
expect(mocktokit.rest.issues.createComment).toHaveBeenCalled()
})
it('Adds a PR message if this is the first contribution', async () => {
github.context.payload.issue = undefined as any
github.context.payload.pull_request = {
number: 10
}
mocktokit.paginate
// Issues
.mockResolvedValueOnce([])
// PRs
.mockResolvedValueOnce([
{
number: 10
}
])
await main.run()
expect(mocktokit.rest.issues.createComment).toHaveBeenCalled()
})
})
describe('isFirstIssue()', () => {
beforeEach(() => {
github.context.payload.issue = {
number: 10
}
})
it('Returns true if no issues are present', async () => {
mocktokit.paginate.mockResolvedValueOnce([])
const result = await main.isFirstIssue(mocktokit)
expect(result).toBe(true)
})
it('Returns true if only the current issue is present', async () => {
mocktokit.paginate.mockResolvedValueOnce([
{
number: 10
}
])
const result = await main.isFirstIssue(mocktokit)
expect(result).toBe(true)
})
it('Returns false if older issues are present', async () => {
mocktokit.paginate.mockResolvedValueOnce([
{
number: 10
},
{
number: 5
}
])
const result = await main.isFirstIssue(mocktokit)
expect(result).toBe(false)
})
it('Ignores pull requests', async () => {
mocktokit.paginate.mockResolvedValueOnce([
{
number: 10
},
{
number: 5,
pull_request: {}
}
])
const result = await main.isFirstIssue(mocktokit)
expect(result).toBe(true)
})
it('Returns false if there is an error', async () => {
mocktokit.paginate.mockRejectedValueOnce(new Error('Error'))
const result = await main.isFirstIssue(mocktokit)
expect(result).toBe(false)
})
})
describe('isFirstPullRequest()', () => {
beforeEach(() => {
github.context.payload.pull_request = {
number: 10
}
})
it('Returns true if no PRs are present', async () => {
mocktokit.paginate.mockResolvedValueOnce([])
const result = await main.isFirstPullRequest(mocktokit)
expect(result).toBe(true)
})
it('Returns true if only the current PR is present', async () => {
mocktokit.paginate.mockResolvedValueOnce([
{
number: 10
}
])
const result = await main.isFirstPullRequest(mocktokit)
expect(result).toBe(true)
})
it('Returns false if older PRs are present', async () => {
mocktokit.paginate.mockResolvedValueOnce([
{
number: 10
},
{
number: 5
}
])
const result = await main.isFirstPullRequest(mocktokit)
expect(result).toBe(false)
})
it('Does not ignore pull requests', async () => {
mocktokit.paginate.mockResolvedValueOnce([
{
number: 10
},
{
number: 5,
pull_request: {}
}
])
const result = await main.isFirstPullRequest(mocktokit)
expect(result).toBe(false)
})
it('Returns false if there is an error', async () => {
mocktokit.paginate.mockRejectedValueOnce(new Error('Error'))
const result = await main.isFirstPullRequest(mocktokit)
expect(result).toBe(false)
})
})
})