# -*- coding: utf-8 -*-
'''Basic tests for cassettes'''

# External imports
import os
from six.moves.urllib.request import urlopen

# Internal imports
import vcr


def test_nonexistent_directory(tmpdir, httpbin):
    '''If we load a cassette in a nonexistent directory, it can save ok'''
    # Check to make sure directory doesnt exist
    assert not os.path.exists(str(tmpdir.join('nonexistent')))

    # Run VCR to create dir and cassette file
    with vcr.use_cassette(str(tmpdir.join('nonexistent', 'cassette.yml'))):
        urlopen(httpbin.url).read()

    # This should have made the file and the directory
    assert os.path.exists(str(tmpdir.join('nonexistent', 'cassette.yml')))


def test_unpatch(tmpdir, httpbin):
    '''Ensure that our cassette gets unpatched when we're done'''
    with vcr.use_cassette(str(tmpdir.join('unpatch.yaml'))) as cass:
        urlopen(httpbin.url).read()

    # Make the same request, and assert that we haven't served any more
    # requests out of cache
    urlopen(httpbin.url).read()
    assert cass.play_count == 0


def test_basic_json_use(tmpdir, httpbin):
    '''
    Ensure you can load a json serialized cassette
    '''
    test_fixture = str(tmpdir.join('synopsis.json'))
    with vcr.use_cassette(test_fixture, serializer='json'):
        response = urlopen(httpbin.url).read()
        assert b'difficult sometimes' in response


def test_patched_content(tmpdir, httpbin):
    '''
    Ensure that what you pull from a cassette is what came from the
    request
    '''
    with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
        response = urlopen(httpbin.url).read()
        assert cass.play_count == 0

    with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
        response2 = urlopen(httpbin.url).read()
        assert cass.play_count == 1
        cass._save(force=True)

    with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
        response3 = urlopen(httpbin.url).read()
        assert cass.play_count == 1

    assert response == response2
    assert response2 == response3


def test_patched_content_json(tmpdir, httpbin):
    '''
    Ensure that what you pull from a json cassette is what came from the
    request
    '''

    testfile = str(tmpdir.join('synopsis.json'))

    with vcr.use_cassette(testfile) as cass:
        response = urlopen(httpbin.url).read()
        assert cass.play_count == 0

    with vcr.use_cassette(testfile) as cass:
        response2 = urlopen(httpbin.url).read()
        assert cass.play_count == 1
        cass._save(force=True)

    with vcr.use_cassette(testfile) as cass:
        response3 = urlopen(httpbin.url).read()
        assert cass.play_count == 1

    assert response == response2
    assert response2 == response3
