"""
    Tests cookiecutter baking process and rendered content
"""

import subprocess
import os
import pytest


@pytest.fixture()
def codecommit(cookies):
    result = cookies.bake(
        extra_context={"project_name": "my project",
                       "source_code_repo": "CodeCommit"}
    )
    yield result


@pytest.fixture()
def github(cookies):
    result = cookies.bake(
        extra_context={"project_name": "my project",
                       "source_code_repo": "Github"}
    )
    yield result


def test_project_generation(cookies, codecommit):
    assert codecommit.exit_code == 0
    assert codecommit.exception is None

    bake_tmp_dir = os.path.dirname(codecommit._project_dir)

    assert os.path.isfile(os.path.join(
        bake_tmp_dir, "buildspec.yaml"))
    assert os.path.isfile(os.path.join(
        bake_tmp_dir, "pipeline.yaml"))
    assert os.path.isfile(os.path.join(
        bake_tmp_dir, "Pipeline-Instructions.md"))
    assert os.path.isfile(os.path.join(
        bake_tmp_dir, "pipeline.png"))


def test_codecommit_pipeline_content(cookies, codecommit):

    bake_tmp_dir = os.path.dirname(codecommit._project_dir)
    pipeline = os.path.join(bake_tmp_dir, "pipeline.yaml")

    assert 0 == cloudformation_linting(template=pipeline)

    with open(pipeline) as f:
        pipeline_content = f.readlines()
        pipeline_content = "".join(pipeline_content)

    contents = (
        "Amazon S3",
        "AWS CodeBuild",
        "AWS CloudFormation",
        "BuildArtifactsBucket",
        "BUILD_OUTPUT_BUCKET",
        "CodePipelineExecutionRole",
        "Name: SourceCodeRepo",
        "Category: Build",
        "Category: Deploy",
        "BuildArtifactAsZip",
        "SourceCodeAsZip",
        "AWS CodeCommit",
        "BranchName",
        "RepositoryName",
        "arn:aws:codecommit",
        "CodeCommitRepositoryHttpUrl",
        "CodeCommitRepositorySshUrl",
    )

    for content in contents:
        assert content in pipeline_content


def test_github_pipeline_content(cookies, github):
    bake_tmp_dir = os.path.dirname(github._project_dir)
    pipeline = os.path.join(bake_tmp_dir, "pipeline.yaml")

    with open(pipeline) as f:
        pipeline_content = f.readlines()
        pipeline_content = "".join(pipeline_content)

    contents = (
        "Amazon S3",
        "AWS CodeBuild",
        "AWS CloudFormation",
        "BuildArtifactsBucket",
        "BUILD_OUTPUT_BUCKET",
        "CodePipelineExecutionRole",
        "Name: SourceCodeRepo",
        "Category: Build",
        "Category: Deploy",
        "BuildArtifactAsZip",
        "SourceCodeAsZip",
        "GithubRepo",
        "GithubToken",
        "GithubUser",
        "OAuthToken",
    )

    for content in contents:
        assert content in pipeline_content


def cloudformation_linting(template="pipeline.yaml"):
    """Cloudformation linting via cfn-lint

    Cloudformation linting to validate against the spec

    template : str, optional
        Cloudformation template file (the default is "pipeline.yaml", which is generated upon project baking)

    Returns
    -------
    Int
        Exit status code out of cfn-lint command

    Raises
    ------
    subprocess.CalledProcessError
        subprocess exception when executed command returns a non-0 exit status

    """

    cmd = "cfn-lint"
    exec_info = subprocess.check_call([cmd, template])

    return exec_info