"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
"""
import gzip
import sys

try:
    import StringIO
except:
    pass
from test.testlib.testcase import BaseTestCase
from unittest.mock import MagicMock, patch

import cfnlint.helpers


class TestGetUrlContent(BaseTestCase):
    """Test Get URL Content"""

    @patch("cfnlint.helpers.urlopen")
    def test_get_url_content_unzipped(self, mocked_urlopen):
        """Test success run"""

        input_buffer = '{"key": "value"}'

        cm = MagicMock()
        cm.getcode.return_value = 200
        cm.read.return_value = input_buffer.encode("utf-8")
        cm.__enter__.return_value = cm
        mocked_urlopen.return_value = cm

        url = "http://foo.com"
        result = cfnlint.helpers.get_url_content(url)
        mocked_urlopen.assert_called_with(url)
        self.assertEqual(result, '{"key": "value"}')

    @patch("cfnlint.helpers.urlopen")
    def test_get_url_content_zipped(self, mocked_urlopen):
        """Test success run"""
        input_buffer = '{"key": "value"}'
        cm = MagicMock()
        cm.getcode.return_value = 200
        cm.read.return_value = gzip.compress(input_buffer.encode("utf-8"))

        cm.info.return_value = {"Content-Encoding": "gzip"}
        cm.__enter__.return_value = cm
        mocked_urlopen.return_value = cm

        url = "http://foo.com"
        result = cfnlint.helpers.get_url_content(url)
        mocked_urlopen.assert_called_with(url)
        self.assertEqual(result, '{"key": "value"}')

    @patch("cfnlint.helpers.urlopen")
    @patch("cfnlint.helpers.load_metadata")
    @patch("cfnlint.helpers.save_metadata")
    def test_get_url_content_zipped_cache_update(
        self, mock_save_metadata, mock_load_metadata, mocked_urlopen
    ):
        """Test success run"""
        input_buffer = '{"key": "value"}'
        etag = "ETAG_ONE"
        url = "http://foo.com"

        mock_load_metadata.return_value = {}

        cm = MagicMock()
        cm.getcode.return_value = 200
        cm.info.return_value = {"Content-Encoding": "gzip", "ETag": etag}

        cm.read.return_value = gzip.compress(input_buffer.encode("utf-8"))

        cm.__enter__.return_value = cm
        mocked_urlopen.return_value = cm

        result = cfnlint.helpers.get_url_content(url, caching=True)
        mocked_urlopen.assert_called_with(url)
        mock_load_metadata.assert_called_once()
        mock_save_metadata.assert_called_once()

        self.assertEqual(result, '{"key": "value"}')

    @patch("cfnlint.helpers.urlopen")
    @patch("cfnlint.helpers.load_metadata")
    def test_url_has_newer_version_affirmative(
        self, mock_load_metadata, mocked_urlopen
    ):
        """Test success run"""

        input_buffer = '{"key": "value"}'
        etag = "ETAG_ONE"
        url = "http://foo.com"

        mock_load_metadata.return_value = {"etag": etag}

        cm = MagicMock()
        cm.getcode.return_value = 200
        cm.info.return_value = {"Content-Encoding": "gzip", "ETag": etag}

        cm.__enter__.return_value = cm
        mocked_urlopen.return_value = cm

        result = cfnlint.helpers.url_has_newer_version(url)

        # Python2 does not support caching, so will always return true
        self.assertFalse(result)

    @patch("cfnlint.helpers.urlopen")
    @patch("cfnlint.helpers.load_metadata")
    def test_url_has_newer_version_negative(self, mock_load_metadata, mocked_urlopen):
        """Test success run"""

        input_buffer = '{"key": "value"}'
        # Generate a random ETag to test with
        etag = "ETAG_ONE"
        etag2 = "ETAG_TWO"

        url = "http://foo.com"
        mock_load_metadata.return_value = {"etag": etag}

        cm = MagicMock()
        cm.getcode.return_value = 200
        cm.info.return_value = {"Content-Encoding": "gzip", "ETag": etag2}
        cm.__enter__.return_value = cm
        mocked_urlopen.return_value = cm

        result = cfnlint.helpers.url_has_newer_version(url)
        self.assertTrue(result)