import subprocess
from unittest import mock

import pytest

from tools.bump_action import main


@pytest.fixture
def workflow_and_action(tmp_path):
    base = tmp_path.joinpath("root")

    base.joinpath(".github/workflows").mkdir(parents=True)
    workflow = base.joinpath(".github/workflows/main.yml")

    base.joinpath(".github/actions/myaction").mkdir(parents=True)
    action = base.joinpath(".github/actions/myaction/action.yml")

    yield base, workflow, action


def test_main_noop(workflow_and_action, capsys):
    base, workflow, action = workflow_and_action

    workflow_src = """\
name: main
on:
  push:
jobs:
  main:
    runs-on: ubuntu-latest
    steps:
    - run: echo hi
"""

    action_src = """\
name: my-action
inputs:
  arg:
    required: true

runs:
  using: composite
  steps:
  - run: echo hi
    shell: bash
"""

    workflow.write_text(workflow_src)
    action.write_text(action_src)

    assert main(("actions/whatever", "v1.2.3", f"--base-dir={base}")) == 0
    out, err = capsys.readouterr()
    assert out == err == ""


def test_main_upgrades_action(workflow_and_action, capsys):
    base, workflow, action = workflow_and_action

    workflow_src = """\
name: main
on:
  push:
jobs:
  main:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/whatever@v0.1.2
"""
    workflow_expected = """\
name: main
on:
  push:
jobs:
  main:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/whatever@v1.2.3
"""

    action_src = """\
name: my-action
inputs:
  arg:
    required: true

runs:
  using: composite
  steps:
  - uses: actions/whatever@v0.1.2
"""
    action_expected = """\
name: my-action
inputs:
  arg:
    required: true

runs:
  using: composite
  steps:
  - uses: actions/whatever@v1.2.3
"""

    workflow.write_text(workflow_src)
    action.write_text(action_src)

    with mock.patch.object(subprocess, "call", return_value=123):
        assert main(("actions/whatever", "v1.2.3", f"--base-dir={base}")) == 123

    out, err = capsys.readouterr()
    assert (
        out
        == f"""\
{workflow} upgrading actions/whatever...
{action} upgrading actions/whatever...
freezing...
"""
    )

    assert workflow.read_text() == workflow_expected
    assert action.read_text() == action_expected