import json
import os

import digaws.digaws as digaws

import pytest

import requests

import tests


class MockGetResponse:
    text = tests.AWS_IP_RANGES
    status_code = 200

    @staticmethod
    def json():
        return json.loads(tests.AWS_IP_RANGES)


def mock_get(*args, **kwargs):
    return MockGetResponse()


@pytest.fixture
def create_cache_dir(fs):
    digaws.CACHE_DIR.mkdir(parents=True)


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_cached_valid_file(mocker, fs, create_cache_dir) -> None:
    with open(digaws.CACHE_FILE, 'w') as out:
        out.write(tests.AWS_IP_RANGES)

    response = requests.Response
    response.status_code = 304
    mocker.patch('requests.get', return_value=response)

    result = digaws.get_aws_ip_ranges()

    assert result['syncToken'] == '<PASSWORD>'


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_cached_invalid_file(mocker, fs, create_cache_dir) -> None:
    with open(digaws.CACHE_FILE, 'w'):
        pass

    response = requests.Response
    response.status_code = 304
    mocker.patch('requests.get', return_value=response)

    with pytest.raises(digaws.CachedFileException):
        digaws.get_aws_ip_ranges()


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_cached_deprecated_file(monkeypatch, fs, create_cache_dir) -> None:
    with open(digaws.CACHE_FILE, 'w'):
        pass
    digaws.CACHE_FILE.touch()
    os.utime(digaws.CACHE_FILE, times=(0, 0))

    monkeypatch.setattr(requests, 'get', mock_get)
    result = digaws.get_aws_ip_ranges()

    assert result['syncToken'] == '<PASSWORD>'


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_no_file(monkeypatch, fs, create_cache_dir) -> None:
    monkeypatch.setattr(requests, 'get', mock_get)
    result = digaws.get_aws_ip_ranges()

    assert result['syncToken'] == '<PASSWORD>'


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_invalid_status(mocker, fs, create_cache_dir) -> None:
    response = requests.Response
    response.status_code = 301
    mocker.patch('requests.get', return_value=response)

    with pytest.raises(digaws.UnexpectedRequestException) as e:
        digaws.get_aws_ip_ranges()

    assert e.match('^Unexpected response from')

import json
import os

import digaws.digaws as digaws

import pytest

import requests

import tests


class MockGetResponse:
    text = tests.AWS_IP_RANGES
    status_code = 200

    @staticmethod
    def json():
        return json.loads(tests.AWS_IP_RANGES)


def mock_get(*args, **kwargs):
    return MockGetResponse()


@pytest.fixture
def create_cache_dir(fs):
    digaws.CACHE_DIR.mkdir(parents=True)


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_cached_valid_file(mocker, fs, create_cache_dir) -> None:
    with open(digaws.CACHE_FILE, 'w') as out:
        out.write(tests.AWS_IP_RANGES)

    response = requests.Response
    response.status_code = 304
    mocker.patch('requests.get', return_value=response)

    result = digaws.get_aws_ip_ranges()

    assert result['syncToken'] == '<PASSWORD>'


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_cached_invalid_file(mocker, fs, create_cache_dir) -> None:
    with open(digaws.CACHE_FILE, 'w'):
        pass

    response = requests.Response
    response.status_code = 304
    mocker.patch('requests.get', return_value=response)

    with pytest.raises(digaws.CachedFileException):
        digaws.get_aws_ip_ranges()


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_cached_deprecated_file(monkeypatch, fs, create_cache_dir) -> None:
    with open(digaws.CACHE_FILE, 'w'):
        pass
    digaws.CACHE_FILE.touch()
    os.utime(digaws.CACHE_FILE, times=(0, 0))

    monkeypatch.setattr(requests, 'get', mock_get)
    result = digaws.get_aws_ip_ranges()

    assert result['syncToken'] == '<PASSWORD>'


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_no_file(monkeypatch, fs, create_cache_dir) -> None:
    monkeypatch.setattr(requests, 'get', mock_get)
    result = digaws.get_aws_ip_ranges()

    assert result['syncToken'] == '<PASSWORD>'


@pytest.mark.parametrize('fs', [[None, [digaws]]], indirect=True)
def test_get_aws_ip_ranges_invalid_status(mocker, fs, create_cache_dir) -> None:
    response = requests.Response
    response.status_code = 301
    mocker.patch('requests.get', return_value=response)

    with pytest.raises(digaws.UnexpectedRequestException) as e:
        digaws.get_aws_ip_ranges()

    assert e.match('^Unexpected response from')
