From d97020a8ab127d663124aaa732b80e1a019f96c7 Mon Sep 17 00:00:00 2001 From: Johan Lorenzo Date: Mon, 29 Oct 2018 18:57:57 +0100 Subject: [PATCH] Get up to 100% coverage --- maven_lambda/__init__.py | 10 +- maven_lambda/test/test_init.py | 188 ++++++++++++++++++++++++++++++++- requirements-test.txt | 3 + requirements-test.txt.in | 1 + 4 files changed, 198 insertions(+), 4 deletions(-) diff --git a/maven_lambda/__init__.py b/maven_lambda/__init__.py index 67c6412..f8cece7 100644 --- a/maven_lambda/__init__.py +++ b/maven_lambda/__init__.py @@ -1,6 +1,7 @@ import boto3 import hashlib +import io import urllib.parse from datetime import datetime @@ -107,7 +108,12 @@ def generate_release_maven_metadata(folder_content_keys): ET.SubElement(versioning, 'lastUpdated').text = generate_last_updated() - return ET.tostring(root, encoding="utf8") + # XXX ET.tostring() strips the xml_declaration out if using encoding='unicode' + stream = io.StringIO() + ET.ElementTree(root).write( + stream, encoding='unicode', xml_declaration=True, method='xml', short_empty_elements=True + ) + return stream.getvalue() def generate_versions(folder_content_keys): @@ -133,6 +139,8 @@ def upload_s3_file(bucket_name, folder, file_name, data, content_type='text/plai def generate_checksums(data): + if isinstance(data, str): + data = data.encode() return { 'md5': hashlib.md5(data).hexdigest(), 'sha1': hashlib.sha1(data).hexdigest(), diff --git a/maven_lambda/test/test_init.py b/maven_lambda/test/test_init.py index 0ffeda7..8241951 100644 --- a/maven_lambda/test/test_init.py +++ b/maven_lambda/test/test_init.py @@ -1,8 +1,190 @@ -from maven_lambda import generate_checksums +import pytest +from freezegun import freeze_time +from unittest.mock import MagicMock -def test_generate_checksums(): - assert generate_checksums(b'known string') == { +from maven_lambda import ( + generate_checksums, + generate_last_updated, + generate_release_maven_metadata, + generate_versions, + get_artifact_id, + get_folder_key, + get_group_id, + get_latest_version, + get_version, + lambda_handler, + list_pom_files_in_subfolders, + upload_s3_file, +) + + +def test_lambda_handler(monkeypatch): + event = { + 'Records': [{ + 's3': { + 'bucket': { + 'name': 'some_bucket_name', + }, + 'object': { + 'key': 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + }, + }, + }], + } + context = {} + s3_mock = MagicMock() + monkeypatch.setattr('maven_lambda.s3', s3_mock) + monkeypatch.setattr('maven_lambda.list_pom_files_in_subfolders', lambda _, __: [ + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + ]) + monkeypatch.setattr('maven_lambda.upload_s3_file', lambda _, __, ___, ____, content_type=None: None) # noqa: E501 + + lambda_handler(event, context) + s3_mock.Bucket.assert_called_once_with('some_bucket_name') + + def fail(_, __): + raise ConnectionError() + monkeypatch.setattr('maven_lambda.list_pom_files_in_subfolders', fail) + with pytest.raises(ConnectionError): + lambda_handler(event, context) + + +def test_get_folder_key(): + assert get_folder_key( + 'org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + ) == 'org/mozilla/geckoview/geckoview-nightly-x86/' + + +def test_list_pom_files_in_subfolders(): + bucket_mock = MagicMock() + keys = [ + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom.md5', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom.sha1', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.jar', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.jar.md5', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.jar.sha1', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/64.0.20181018103737/geckoview-nightly-x86-64.0.20181018103737.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/64.0.20181018103737/geckoview-nightly-x86-64.0.20181018103737.jar', # noqa: E501 + ] + bucket_mock.objects.filter.return_value = [MagicMock(key=key) for key in keys] + + assert list_pom_files_in_subfolders( + bucket_mock, 'maven2/org/mozilla/geckoview/geckoview-nightly-x86' + ) == [ + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/64.0.20181018103737/geckoview-nightly-x86-64.0.20181018103737.pom', # noqa: E501 + ] + bucket_mock.objects.filter.assert_called_once_with( + Prefix='maven2/org/mozilla/geckoview/geckoview-nightly-x86' + ) + + +@pytest.mark.parametrize('key', ( + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + 'org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 +)) +def test_get_group_id(key): + assert get_group_id(key) == 'org.mozilla.geckoview' + + +def test_get_artifact_id(): + assert get_artifact_id( + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + ) == 'geckoview-nightly-x86' + + +def test_get_version(): + assert get_version( + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + ) == '63.0.20180830111743' + + +@freeze_time('2018-10-29 16:00:30') +def test_generate_release_maven_metadata(): + assert generate_release_maven_metadata([ + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/64.0.20181018103737/geckoview-nightly-x86-64.0.20181018103737.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/65.0.20181028102554/geckoview-nightly-x86-65.0.20181028102554.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830100125/geckoview-nightly-x86-63.0.20180830100125.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/65.0.20181029100346/geckoview-nightly-x86-65.0.20181029100346.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/64.0.20181019100100/geckoview-nightly-x86-64.0.20181019100100.pom', # noqa: E501 + ]) == ("\n" +"" + "org.mozilla.geckoview" + "geckoview-nightly-x86" + "" + "65.0.20181029100346" + "65.0.20181029100346" + "" + "63.0.20180830100125" + "63.0.20180830111743" + "64.0.20181018103737" + "64.0.20181019100100" + "65.0.20181028102554" + "65.0.20181029100346" + "" + "20181029160030" + "" +"") + + +def test_generate_versions(): + assert generate_versions([ + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/64.0.20181018103737/geckoview-nightly-x86-64.0.20181018103737.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830111743/geckoview-nightly-x86-63.0.20180830111743.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/65.0.20181028102554/geckoview-nightly-x86-65.0.20181028102554.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/63.0.20180830100125/geckoview-nightly-x86-63.0.20180830100125.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/65.0.20181029100346/geckoview-nightly-x86-65.0.20181029100346.pom', # noqa: E501 + 'maven2/org/mozilla/geckoview/geckoview-nightly-x86/64.0.20181019100100/geckoview-nightly-x86-64.0.20181019100100.pom', # noqa: E501 + ]) == [ + '63.0.20180830100125', + '63.0.20180830111743', + '64.0.20181018103737', + '64.0.20181019100100', + '65.0.20181028102554', + '65.0.20181029100346', + ] + + +@freeze_time('2018-10-29 16:00:30') +def test_generate_last_updated(): + assert generate_last_updated() == '20181029160030' + + +def test_get_latest_version(): + assert get_latest_version([ + '64.0.20181018103737', + '63.0.20180830111743', + '65.0.20181028102554', + '63.0.20180830100125', + '65.0.20181029100346', + '64.0.20181019100100', + ]) == '65.0.20181029100346' + + +def test_upload_s3_file(monkeypatch): + s3_mock = MagicMock() + object_mock = MagicMock() + s3_mock.Object.return_value = object_mock + monkeypatch.setattr('maven_lambda.s3', s3_mock) + upload_s3_file( + 'some_bucket', 'some/folder/', 'some_file', 'some data', content_type='some/content-type' + ) + + s3_mock.Object.assert_called_once_with('some_bucket', 'some/folder/some_file') + object_mock.put.assert_called_once_with(Body='some data', ContentType='some/content-type') + + +@pytest.mark.parametrize('data', ( + 'known string', + b'known string', +)) +def test_generate_checksums(data): + assert generate_checksums(data) == { 'md5': 'a48fba03a9ac529b358935164826d9fe', 'sha1': '714f4de20aa1899ed09e22a82304e12d4658eac1', } diff --git a/requirements-test.txt b/requirements-test.txt index 5f43a28..5506148 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -60,6 +60,9 @@ docutils==0.14 \ flake8==3.6.0 \ --hash=sha512:0bfcc8ec78fba7d27de77a42dffac350afc99b63a772dc41945bc51068b2f13c180959d6827f2ab2330eff07f35c5980a1ffd04ef7cff0bfb290b7c58a414637 \ --hash=sha512:f4377bc7806074a88f88b3652c3061583e576ee515b2b741cee9c6dc18f84f34a7807c93fda9dca3d8b006e379dcee60bb3ae20e6a2e62fd216a82a2b36f2eb5 +freezegun==0.3.11 \ + --hash=sha512:ab8a4c79e48ba3a8737f55177ce3370aa0b7875893fdf28e58d2ffdaafdccefea94f618b86c9ccb813aab447a1f8bd1d3ee7f0bd54dfa81f65d96f1756ecda99 \ + --hash=sha512:e8b392176641d52f6ed795c9af5fbc0a62892aeedf32b42375b56ab44a9ad7a5ecd3bb81363ed0ae65204aff2ef894cd7f2e17f42be72f31d3409b2bffa59ab8 jmespath==0.9.3 \ --hash=sha512:738e44d8027ef2a61ae52106cb44718a32b1200a5ae1b595c8fe0fd56a4ec1560091a207a1c136966760475d8c92d3e6ea9b88a4ef86c18a554d4e71ce0809ff \ --hash=sha512:eeab444df7a29c0bc64bd8064c942a5b02772d39d6d262dbef1d43ebaf7e4eb97c34fb1df3a47c6da011a632ec5f9b1ffe62ac51929e8d412368b907ebbb85a7 diff --git a/requirements-test.txt.in b/requirements-test.txt.in index fcfb3c1..d7c8d92 100644 --- a/requirements-test.txt.in +++ b/requirements-test.txt.in @@ -1,5 +1,6 @@ # pyup: ignore file -r requirements.txt.in flake8 +freezegun pytest pytest-cov