import boto3
import pytest
from botocore.exceptions import ClientError

from moto import mock_aws


@mock_aws
class TestHostedConfigurationVersions:
    def setup_method(self, *args):  # pylint: disable=unused-argument
        self.client = boto3.client("appconfig", region_name="us-west-1")
        self.app_id = self.client.create_application(Name="testapp")["Id"]
        self.config_profile_id = self.client.create_configuration_profile(
            ApplicationId=self.app_id,
            Name="config_name",
            Description="desc",
            LocationUri="luri",
            RetrievalRoleArn="rrarn:rrarn:rrarn:rrarn",
            Validators=[{"Type": "JSON", "Content": "c"}],
            Type="freeform",
        )["Id"]

    def test_create_hosted_configuration_version(self):
        resp = self.client.create_hosted_configuration_version(
            ApplicationId=self.app_id,
            ConfigurationProfileId=self.config_profile_id,
            Description="desc",
            Content=b"asdf",
            ContentType="text/xml",
            VersionLabel="vl",
        )
        assert resp["ApplicationId"] == self.app_id
        assert resp["ConfigurationProfileId"] == self.config_profile_id
        assert resp["VersionNumber"] == 1
        assert resp["Description"] == "desc"
        assert resp["VersionLabel"] == "vl"
        assert resp["ContentType"] == "text/xml"
        assert resp["Content"].read() == b"asdf"

        resp = self.client.create_hosted_configuration_version(
            ApplicationId=self.app_id,
            ConfigurationProfileId=self.config_profile_id,
            Content=b"asdf",
            ContentType="text/xml",
        )
        assert resp["VersionNumber"] == 2

    def test_get_hosted_configuration_version(self):
        self.client.create_hosted_configuration_version(
            ApplicationId=self.app_id,
            ConfigurationProfileId=self.config_profile_id,
            Description="desc",
            Content=b"asdf",
            ContentType="text/xml",
            VersionLabel="vl",
        )
        get = self.client.get_hosted_configuration_version(
            ApplicationId=self.app_id,
            ConfigurationProfileId=self.config_profile_id,
            VersionNumber=1,
        )
        assert get["ApplicationId"] == self.app_id
        assert get["ConfigurationProfileId"] == self.config_profile_id
        assert get["Description"] == "desc"
        assert get["VersionLabel"] == "vl"
        assert get["ContentType"] == "text/xml"
        assert get["Content"].read() == b"asdf"

    def test_delete_hosted_configuration_version(self):
        self.client.create_hosted_configuration_version(
            ApplicationId=self.app_id,
            ConfigurationProfileId=self.config_profile_id,
            Content=b"asdf",
            ContentType="text/xml",
        )
        self.client.delete_hosted_configuration_version(
            ApplicationId=self.app_id,
            ConfigurationProfileId=self.config_profile_id,
            VersionNumber=1,
        )
        with pytest.raises(ClientError) as exc:
            self.client.get_hosted_configuration_version(
                ApplicationId=self.app_id,
                ConfigurationProfileId=self.config_profile_id,
                VersionNumber=1,
            )
        err = exc.value.response["Error"]
        assert err["Code"] == "ResourceNotFoundException"