Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get up to 100% coverage #4

Merged
merged 1 commit into from
Oct 31, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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