import * as fetch from '@/scripts/net'
import apt from '@/scripts/cli/AptCommand'
import { Stdio } from './stdio'

jest.mock('@/scripts/net')

describe('install plugin', () => {
  it('succeeded', async () => {
    fetch.post.mockResolvedValue({ code: 0, message: 'ok' })
    const stdio = new Stdio()

    await apt(stdio, ['install', 'test'])
    expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', {
      name: 'test',
    })
    expect(stdio.getStdout()).toInclude('ok')
  })

  it('failed with reasons', async () => {
    fetch.post.mockResolvedValue({
      code: 1,
      message: 'failed',
      data: { reason: ['unresolved'] },
    })
    const stdio = new Stdio()

    await apt(stdio, ['install', 'test'])
    expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', {
      name: 'test',
    })
    expect(stdio.getStdout()).toInclude('failed')
    expect(stdio.getStdout()).toInclude('- unresolved')
  })

  it('use `upgrade` command', async () => {
    fetch.post.mockResolvedValue({ code: 0, message: 'ok' })
    const stdio = new Stdio()

    await apt(stdio, ['upgrade', 'test'])
    expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', {
      name: 'test',
    })
    expect(stdio.getStdout()).toInclude('ok')
  })
})

describe('remove plugin', () => {
  beforeAll(() => jest.useRealTimers())

  it('cancelled', async () => {
    const stdio = new Stdio()

    setTimeout(() => process.stdin.emit('keypress', 'n', 'n'), 0)
    await apt(stdio, ['remove', 'test'])
    expect(fetch.post).not.toBeCalled()
  })

  it('succeeded', async () => {
    fetch.post.mockResolvedValue({ code: 0, message: 'ok' })
    const stdio = new Stdio()

    setTimeout(() => process.stdin.emit('keypress', 'y', 'y'), 0)
    await apt(stdio, ['remove', 'test'])
    expect(fetch.post).toBeCalledWith('/admin/plugins/manage', {
      action: 'delete',
      name: 'test',
    })
    expect(stdio.getStdout()).toInclude('ok')
  })
})
