import {GitCommandManager} from '../lib/git-command-manager'
import {GitConfigHelper} from '../lib/git-config-helper'

const REPO_PATH = '/git/test-repo'

describe('git-config-helper tests', () => {
  let gitConfigHelper: GitConfigHelper

  beforeAll(async () => {
    const git = await GitCommandManager.create(REPO_PATH)
    gitConfigHelper = new GitConfigHelper(git)
  })

  it('adds and unsets a config option', async () => {
    const add = await gitConfigHelper.addConfigOption(
      'test.add.and.unset.config.option',
      'foo'
    )
    expect(add).toBeTruthy()
    const unset = await gitConfigHelper.unsetConfigOption(
      'test.add.and.unset.config.option'
    )
    expect(unset).toBeTruthy()
  })

  it('adds and unsets a config option with value regex', async () => {
    const add = await gitConfigHelper.addConfigOption(
      'test.add.and.unset.config.option',
      'foo bar'
    )
    expect(add).toBeTruthy()
    const unset = await gitConfigHelper.unsetConfigOption(
      'test.add.and.unset.config.option',
      '^foo'
    )
    expect(unset).toBeTruthy()
  })

  it('determines that a config option exists', async () => {
    const result = await gitConfigHelper.configOptionExists('remote.origin.url')
    expect(result).toBeTruthy()
  })

  it('determines that a config option does not exist', async () => {
    const result = await gitConfigHelper.configOptionExists(
      'this.key.does.not.exist'
    )
    expect(result).toBeFalsy()
  })

  it('successfully retrieves a config option', async () => {
    const add = await gitConfigHelper.addConfigOption(
      'test.get.config.option',
      'foo'
    )
    expect(add).toBeTruthy()
    const option = await gitConfigHelper.getConfigOption(
      'test.get.config.option'
    )
    expect(option.value).toEqual('foo')
    const unset = await gitConfigHelper.unsetConfigOption(
      'test.get.config.option'
    )
    expect(unset).toBeTruthy()
  })

  it('gets a config option with value regex', async () => {
    const add = await gitConfigHelper.addConfigOption(
      'test.get.config.option',
      'foo bar'
    )
    expect(add).toBeTruthy()
    const option = await gitConfigHelper.getConfigOption(
      'test.get.config.option',
      '^foo'
    )
    expect(option.value).toEqual('foo bar')
    const unset = await gitConfigHelper.unsetConfigOption(
      'test.get.config.option',
      '^foo'
    )
    expect(unset).toBeTruthy()
  })

  it('gets and unsets a config option', async () => {
    const add = await gitConfigHelper.addConfigOption(
      'test.get.and.unset.config.option',
      'foo'
    )
    expect(add).toBeTruthy()
    const getAndUnset = await gitConfigHelper.getAndUnsetConfigOption(
      'test.get.and.unset.config.option'
    )
    expect(getAndUnset.value).toEqual('foo')
  })

  it('gets and unsets a config option with value regex', async () => {
    const add = await gitConfigHelper.addConfigOption(
      'test.get.and.unset.config.option',
      'foo bar'
    )
    expect(add).toBeTruthy()
    const getAndUnset = await gitConfigHelper.getAndUnsetConfigOption(
      'test.get.and.unset.config.option',
      '^foo'
    )
    expect(getAndUnset.value).toEqual('foo bar')
  })

  it('fails to get and unset a config option', async () => {
    const getAndUnset = await gitConfigHelper.getAndUnsetConfigOption(
      'this.key.does.not.exist'
    )
    expect(getAndUnset.name).toEqual('')
    expect(getAndUnset.value).toEqual('')
  })
})