import pytest import requests from mock import mock from flask import Flask from test import testconfig from util.tufmetadata import api valid_response = { 'signed' : { 'type': 'Targets', 'delegations': { 'keys': {}, 'roles': {}, }, 'expires': '2020-03-30T18:55:26.594764859-04:00', 'targets': { 'latest': { 'hashes': { 'sha256': 'mLmxwTyUrqIRDaz8uaBapfrp3GPERfsDg2kiMujlteo=' }, 'length': 1500 } }, 'version': 2 }, 'signatures': [ { 'method': 'ecdsa', 'sig': 'yYnJGsYAYEL9PSwXisdG7JUEM1YK2IIKM147K3fWJthF4w+vl3xOm67r5ZNuDK6ss/Ff+x8yljZdT3sE/Hg5mw==' } ] } @pytest.mark.parametrize('response_code,response_body,expected', [ (200, valid_response, valid_response['signed']['targets']), (200, {'garbage': 'data'}, None) ]) def test_get_metadata(response_code, response_body, expected): app = Flask(__name__) app.config.from_object(testconfig.TestConfig()) client = mock.Mock() request = mock.Mock(status_code=response_code) request.json.return_value = response_body client.request.return_value = request tuf_api = api.TUFMetadataAPI(app, app.config, client=client) tags, _ = tuf_api.get_default_tags('quay', 'quay') assert tags == expected @pytest.mark.parametrize('connection_error,response_code,exception', [ (True, 200, requests.exceptions.Timeout), (True, 200, requests.exceptions.ConnectionError), (False, 200, requests.exceptions.RequestException), (False, 200, ValueError), (True, 500, api.Non200ResponseException(mock.Mock(status_code=500))), (False, 400, api.Non200ResponseException(mock.Mock(status_code=400))), (False, 404, api.Non200ResponseException(mock.Mock(status_code=404))), (False, 200, api.InvalidMetadataException) ]) def test_get_metadata_exception(connection_error, response_code, exception): app = Flask(__name__) app.config.from_object(testconfig.TestConfig()) request = mock.Mock(status_code=response_code) client = mock.Mock(request=request) client.request.side_effect = exception tuf_api = api.TUFMetadataAPI(app, app.config, client=client) tags, _ = tuf_api.get_default_tags('quay', 'quay') assert tags == None