// Initial env variable setup for tests.
process.env['INPUT_FOLDER'] = 'build'
process.env['GITHUB_SHA'] = '123'
process.env['INPUT_DEBUG'] = 'debug'

import '../src/main'
import {action} from '../src/constants'
import run from '../src/lib'
import {execute} from '../src/execute'
import {rmRF} from '@actions/io'
import {setFailed, exportVariable} from '@actions/core'

const originalAction = JSON.stringify(action)

jest.mock('../src/execute', () => ({
  execute: jest.fn()
}))

jest.mock('@actions/io', () => ({
  rmRF: jest.fn()
}))

jest.mock('@actions/core', () => ({
  setFailed: jest.fn(),
  getInput: jest.fn(),
  exportVariable: jest.fn(),
  isDebug: jest.fn(),
  info: jest.fn()
}))

describe('main', () => {
  afterEach(() => {
    Object.assign(action, JSON.parse(originalAction))
  })

  it('should run through the commands', async () => {
    Object.assign(action, {
      repositoryPath: 'JamesIves/github-pages-deploy-action',
      folder: 'assets',
      branch: 'branch',
      gitHubToken: '123',
      pusher: {
        name: 'asd',
        email: 'as@cat'
      },
      isTest: false,
      debug: true
    })
    await run(action)
    expect(execute).toBeCalledTimes(19)
    expect(rmRF).toBeCalledTimes(1)
    expect(exportVariable).toBeCalledTimes(1)
  })

  it('should run through the commands and succeed', async () => {
    Object.assign(action, {
      repositoryPath: 'JamesIves/github-pages-deploy-action',
      folder: 'assets',
      branch: 'branch',
      gitHubToken: '123',
      pusher: {
        name: 'asd',
        email: 'as@cat'
      }
    })
    await run(action)
    expect(execute).toBeCalledTimes(18)
    expect(rmRF).toBeCalledTimes(1)
    expect(exportVariable).toBeCalledTimes(1)
  })

  it('should throw if an error is encountered', async () => {
    Object.assign(action, {
      folder: 'assets',
      branch: 'branch',
      baseBranch: 'master',
      gitHubToken: null,
      ssh: null,
      accessToken: null,
      pusher: {
        name: 'asd',
        email: 'as@cat'
      },
      isTest: true
    })
    await run(action)
    expect(execute).toBeCalledTimes(0)
    expect(setFailed).toBeCalledTimes(1)
    expect(exportVariable).toBeCalledTimes(1)
  })
})
