232 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import * as core from '@actions/core'
 | |
| import * as github from '@actions/github'
 | |
| import artifact, {ArtifactNotFoundError} from '@actions/artifact'
 | |
| import {run} from '../src/upload/upload-artifact'
 | |
| import {Inputs} from '../src/upload/constants'
 | |
| import * as search from '../src/shared/search'
 | |
| 
 | |
| const fixtures = {
 | |
|   artifactName: 'artifact-name',
 | |
|   rootDirectory: '/some/artifact/path',
 | |
|   filesToUpload: [
 | |
|     '/some/artifact/path/file1.txt',
 | |
|     '/some/artifact/path/file2.txt'
 | |
|   ]
 | |
| }
 | |
| 
 | |
| jest.mock('@actions/github', () => ({
 | |
|   context: {
 | |
|     repo: {
 | |
|       owner: 'actions',
 | |
|       repo: 'toolkit'
 | |
|     },
 | |
|     runId: 123,
 | |
|     serverUrl: 'https://github.com'
 | |
|   }
 | |
| }))
 | |
| 
 | |
| jest.mock('@actions/core')
 | |
| 
 | |
| /* eslint-disable no-unused-vars */
 | |
| const mockInputs = (overrides?: Partial<{[K in Inputs]?: any}>) => {
 | |
|   const inputs = {
 | |
|     [Inputs.Name]: 'artifact-name',
 | |
|     [Inputs.Path]: '/some/artifact/path',
 | |
|     [Inputs.IfNoFilesFound]: 'warn',
 | |
|     [Inputs.RetentionDays]: 0,
 | |
|     [Inputs.CompressionLevel]: 6,
 | |
|     [Inputs.Overwrite]: false,
 | |
|     ...overrides
 | |
|   }
 | |
| 
 | |
|   ;(core.getInput as jest.Mock).mockImplementation((name: string) => {
 | |
|     return inputs[name]
 | |
|   })
 | |
|   ;(core.getBooleanInput as jest.Mock).mockImplementation((name: string) => {
 | |
|     return inputs[name]
 | |
|   })
 | |
| 
 | |
|   return inputs
 | |
| }
 | |
| 
 | |
| describe('upload', () => {
 | |
|   beforeEach(async () => {
 | |
|     mockInputs()
 | |
| 
 | |
|     jest.spyOn(search, 'findFilesToUpload').mockResolvedValue({
 | |
|       filesToUpload: fixtures.filesToUpload,
 | |
|       rootDirectory: fixtures.rootDirectory
 | |
|     })
 | |
| 
 | |
|     jest.spyOn(artifact, 'uploadArtifact').mockResolvedValue({
 | |
|       size: 123,
 | |
|       id: 1337
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('uploads a single file', async () => {
 | |
|     jest.spyOn(search, 'findFilesToUpload').mockResolvedValue({
 | |
|       filesToUpload: [fixtures.filesToUpload[0]],
 | |
|       rootDirectory: fixtures.rootDirectory
 | |
|     })
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(artifact.uploadArtifact).toHaveBeenCalledWith(
 | |
|       fixtures.artifactName,
 | |
|       [fixtures.filesToUpload[0]],
 | |
|       fixtures.rootDirectory,
 | |
|       {compressionLevel: 6}
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('uploads multiple files', async () => {
 | |
|     await run()
 | |
| 
 | |
|     expect(artifact.uploadArtifact).toHaveBeenCalledWith(
 | |
|       fixtures.artifactName,
 | |
|       fixtures.filesToUpload,
 | |
|       fixtures.rootDirectory,
 | |
|       {compressionLevel: 6}
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('sets outputs', async () => {
 | |
|     await run()
 | |
| 
 | |
|     expect(core.setOutput).toHaveBeenCalledWith('artifact-id', 1337)
 | |
|     expect(core.setOutput).toHaveBeenCalledWith(
 | |
|       'artifact-url',
 | |
|       `${github.context.serverUrl}/${github.context.repo.owner}/${
 | |
|         github.context.repo.repo
 | |
|       }/actions/runs/${github.context.runId}/artifacts/${1337}`
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('supports custom compression level', async () => {
 | |
|     mockInputs({
 | |
|       [Inputs.CompressionLevel]: 2
 | |
|     })
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(artifact.uploadArtifact).toHaveBeenCalledWith(
 | |
|       fixtures.artifactName,
 | |
|       fixtures.filesToUpload,
 | |
|       fixtures.rootDirectory,
 | |
|       {compressionLevel: 2}
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('supports custom retention days', async () => {
 | |
|     mockInputs({
 | |
|       [Inputs.RetentionDays]: 7
 | |
|     })
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(artifact.uploadArtifact).toHaveBeenCalledWith(
 | |
|       fixtures.artifactName,
 | |
|       fixtures.filesToUpload,
 | |
|       fixtures.rootDirectory,
 | |
|       {retentionDays: 7, compressionLevel: 6}
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('supports warn if-no-files-found', async () => {
 | |
|     mockInputs({
 | |
|       [Inputs.IfNoFilesFound]: 'warn'
 | |
|     })
 | |
| 
 | |
|     jest.spyOn(search, 'findFilesToUpload').mockResolvedValue({
 | |
|       filesToUpload: [],
 | |
|       rootDirectory: fixtures.rootDirectory
 | |
|     })
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(core.warning).toHaveBeenCalledWith(
 | |
|       `No files were found with the provided path: ${fixtures.rootDirectory}. No artifacts will be uploaded.`
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('supports error if-no-files-found', async () => {
 | |
|     mockInputs({
 | |
|       [Inputs.IfNoFilesFound]: 'error'
 | |
|     })
 | |
| 
 | |
|     jest.spyOn(search, 'findFilesToUpload').mockResolvedValue({
 | |
|       filesToUpload: [],
 | |
|       rootDirectory: fixtures.rootDirectory
 | |
|     })
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(core.setFailed).toHaveBeenCalledWith(
 | |
|       `No files were found with the provided path: ${fixtures.rootDirectory}. No artifacts will be uploaded.`
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('supports ignore if-no-files-found', async () => {
 | |
|     mockInputs({
 | |
|       [Inputs.IfNoFilesFound]: 'ignore'
 | |
|     })
 | |
| 
 | |
|     jest.spyOn(search, 'findFilesToUpload').mockResolvedValue({
 | |
|       filesToUpload: [],
 | |
|       rootDirectory: fixtures.rootDirectory
 | |
|     })
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(core.info).toHaveBeenCalledWith(
 | |
|       `No files were found with the provided path: ${fixtures.rootDirectory}. No artifacts will be uploaded.`
 | |
|     )
 | |
|   })
 | |
| 
 | |
|   it('supports overwrite', async () => {
 | |
|     mockInputs({
 | |
|       [Inputs.Overwrite]: true
 | |
|     })
 | |
| 
 | |
|     jest.spyOn(artifact, 'deleteArtifact').mockResolvedValue({
 | |
|       id: 1337
 | |
|     })
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(artifact.uploadArtifact).toHaveBeenCalledWith(
 | |
|       fixtures.artifactName,
 | |
|       fixtures.filesToUpload,
 | |
|       fixtures.rootDirectory,
 | |
|       {compressionLevel: 6}
 | |
|     )
 | |
| 
 | |
|     expect(artifact.deleteArtifact).toHaveBeenCalledWith(fixtures.artifactName)
 | |
|   })
 | |
| 
 | |
|   it('supports overwrite and continues if not found', async () => {
 | |
|     mockInputs({
 | |
|       [Inputs.Overwrite]: true
 | |
|     })
 | |
| 
 | |
|     jest
 | |
|       .spyOn(artifact, 'deleteArtifact')
 | |
|       .mockRejectedValue(new ArtifactNotFoundError('not found'))
 | |
| 
 | |
|     await run()
 | |
| 
 | |
|     expect(artifact.uploadArtifact).toHaveBeenCalledWith(
 | |
|       fixtures.artifactName,
 | |
|       fixtures.filesToUpload,
 | |
|       fixtures.rootDirectory,
 | |
|       {compressionLevel: 6}
 | |
|     )
 | |
| 
 | |
|     expect(artifact.deleteArtifact).toHaveBeenCalledWith(fixtures.artifactName)
 | |
|     expect(core.debug).toHaveBeenCalledWith(
 | |
|       `Skipping deletion of '${fixtures.artifactName}', it does not exist`
 | |
|     )
 | |
|   })
 | |
| })
 |