Skip to content

Commit

Permalink
Get up to 100% coverage (mozilla-releng#4)
Browse files Browse the repository at this point in the history
  • Loading branch information
JohanLorenzo committed Oct 31, 2018
1 parent d069f05 commit c09861a
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 4 deletions.
10 changes: 9 additions & 1 deletion maven_lambda/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

import boto3
import hashlib
import io
import urllib.parse

from datetime import datetime
Expand Down Expand Up @@ -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):
Expand All @@ -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(),
Expand Down
188 changes: 185 additions & 3 deletions maven_lambda/test/test_init.py
Original file line number Diff line number Diff line change
@@ -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
]) == ("<?xml version='1.0' encoding='UTF-8'?>\n"
"<metadata>"
"<groupId>org.mozilla.geckoview</groupId>"
"<artifactId>geckoview-nightly-x86</artifactId>"
"<versioning>"
"<latest>65.0.20181029100346</latest>"
"<release>65.0.20181029100346</release>"
"<versions>"
"<version>63.0.20180830100125</version>"
"<version>63.0.20180830111743</version>"
"<version>64.0.20181018103737</version>"
"<version>64.0.20181019100100</version>"
"<version>65.0.20181028102554</version>"
"<version>65.0.20181029100346</version>"
"</versions>"
"<lastUpdated>20181029160030</lastUpdated>"
"</versioning>"
"</metadata>")


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',
}
3 changes: 3 additions & 0 deletions requirements-test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions requirements-test.txt.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# pyup: ignore file
-r requirements.txt.in
flake8
freezegun
pytest
pytest-cov

0 comments on commit c09861a

Please sign in to comment.