import pytest

boto = pytest.importorskip("boto")

import boto  # NOQA
import boto.iam  # NOQA
from boto.s3.connection import S3Connection  # NOQA
from boto.s3.key import Key  # NOQA
from configparser import DuplicateSectionError  # NOQA
import vcr  # NOQA


def test_boto_stubs(tmpdir):
    with vcr.use_cassette(str(tmpdir.join("boto-stubs.yml"))):
        # Perform the imports within the patched context so that
        # CertValidatingHTTPSConnection refers to the patched version.
        from boto.https_connection import CertValidatingHTTPSConnection
        from vcr.stubs.boto_stubs import VCRCertValidatingHTTPSConnection

        # Prove that the class was patched by the stub and that we can instantiate it.
        assert issubclass(CertValidatingHTTPSConnection, VCRCertValidatingHTTPSConnection)
        CertValidatingHTTPSConnection("hostname.does.not.matter")


def test_boto_without_vcr():
    s3_conn = S3Connection()
    s3_bucket = s3_conn.get_bucket("boto-demo-1394171994")  # a bucket you can access
    k = Key(s3_bucket)
    k.key = "test.txt"
    k.set_contents_from_string("hello world i am a string")


def test_boto_medium_difficulty(tmpdir):
    s3_conn = S3Connection()
    s3_bucket = s3_conn.get_bucket("boto-demo-1394171994")  # a bucket you can access
    with vcr.use_cassette(str(tmpdir.join("boto-medium.yml"))):
        k = Key(s3_bucket)
        k.key = "test.txt"
        k.set_contents_from_string("hello world i am a string")

    with vcr.use_cassette(str(tmpdir.join("boto-medium.yml"))):
        k = Key(s3_bucket)
        k.key = "test.txt"
        k.set_contents_from_string("hello world i am a string")


def test_boto_hardcore_mode(tmpdir):
    with vcr.use_cassette(str(tmpdir.join("boto-hardcore.yml"))):
        s3_conn = S3Connection()
        s3_bucket = s3_conn.get_bucket("boto-demo-1394171994")  # a bucket you can access
        k = Key(s3_bucket)
        k.key = "test.txt"
        k.set_contents_from_string("hello world i am a string")

    with vcr.use_cassette(str(tmpdir.join("boto-hardcore.yml"))):
        s3_conn = S3Connection()
        s3_bucket = s3_conn.get_bucket("boto-demo-1394171994")  # a bucket you can access
        k = Key(s3_bucket)
        k.key = "test.txt"
        k.set_contents_from_string("hello world i am a string")


def test_boto_iam(tmpdir):
    try:
        boto.config.add_section("Boto")
    except DuplicateSectionError:
        pass
    # Ensure that boto uses HTTPS
    boto.config.set("Boto", "is_secure", "true")
    # Ensure that boto uses CertValidatingHTTPSConnection
    boto.config.set("Boto", "https_validate_certificates", "true")

    with vcr.use_cassette(str(tmpdir.join("boto-iam.yml"))):
        iam_conn = boto.iam.connect_to_region("universal")
        iam_conn.get_all_users()

    with vcr.use_cassette(str(tmpdir.join("boto-iam.yml"))):
        iam_conn = boto.iam.connect_to_region("universal")
        iam_conn.get_all_users()
