Merge remote-tracking branch 'upstream/master' into python-registry-v2
This commit is contained in:
commit
210ed7cf02
148 changed files with 1829 additions and 445 deletions
Binary file not shown.
|
@ -2,13 +2,15 @@ import unittest
|
|||
|
||||
from endpoints.v1 import v1_bp
|
||||
from endpoints.verbs import verbs
|
||||
|
||||
from app import app
|
||||
|
||||
class TestAnonymousAccessChecked(unittest.TestCase):
|
||||
def verifyBlueprint(self, blueprint):
|
||||
class Checker(object):
|
||||
def __init__(self, test_case):
|
||||
self.test_case = test_case
|
||||
self.first_registration = True
|
||||
self.app = app
|
||||
|
||||
def add_url_rule(self, rule, endpoint, view_function, methods=None):
|
||||
if (not '__anon_protected' in dir(view_function) and
|
||||
|
|
|
@ -1968,6 +1968,19 @@ class TestOrganizationMemberBuynlargeDevtable(ApiTestCase):
|
|||
ApiTestCase.setUp(self)
|
||||
self._set_url(OrganizationMember, orgname="buynlarge", membername="someuser")
|
||||
|
||||
def test_get_anonymous(self):
|
||||
self._run_test('GET', 401, None, None)
|
||||
|
||||
def test_get_freshuser(self):
|
||||
self._run_test('GET', 403, 'freshuser', None)
|
||||
|
||||
def test_get_reader(self):
|
||||
self._run_test('GET', 403, 'reader', None)
|
||||
|
||||
def test_get_devtable(self):
|
||||
self._run_test('GET', 404, 'devtable', None)
|
||||
|
||||
|
||||
def test_delete_anonymous(self):
|
||||
self._run_test('DELETE', 401, None, None)
|
||||
|
||||
|
|
|
@ -878,6 +878,13 @@ class TestGetOrganizationMembers(ApiTestCase):
|
|||
assert READ_ACCESS_USER in membernames
|
||||
assert not NO_ACCESS_USER in membernames
|
||||
|
||||
for member in json['members']:
|
||||
membername = member['name']
|
||||
response = self.getJsonResponse(OrganizationMember,
|
||||
params=dict(orgname=ORGANIZATION, membername=membername))
|
||||
|
||||
self.assertEquals(member, response)
|
||||
|
||||
|
||||
class TestRemoveOrganizationMember(ApiTestCase):
|
||||
def test_try_remove_only_admin(self):
|
||||
|
@ -1759,8 +1766,55 @@ class TestRepoBuilds(ApiTestCase):
|
|||
self.assertEquals(status_json['resource_key'], build['resource_key'])
|
||||
self.assertEquals(status_json['trigger'], build['trigger'])
|
||||
|
||||
|
||||
class TestRequestRepoBuild(ApiTestCase):
|
||||
def test_requestrepobuild(self):
|
||||
def test_requestbuild_noidurl(self):
|
||||
self.login(ADMIN_ACCESS_USER)
|
||||
|
||||
# Request a (fake) build without a file ID or URL.
|
||||
self.postResponse(RepositoryBuildList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'),
|
||||
data=dict(),
|
||||
expected_code=400)
|
||||
|
||||
def test_requestbuild_invalidurls(self):
|
||||
self.login(ADMIN_ACCESS_USER)
|
||||
|
||||
# Request a (fake) build with and invalid URL.
|
||||
self.postResponse(RepositoryBuildList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'),
|
||||
data=dict(archive_url='foobarbaz'),
|
||||
expected_code=400)
|
||||
|
||||
self.postResponse(RepositoryBuildList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'),
|
||||
data=dict(archive_url='file://foobarbaz'),
|
||||
expected_code=400)
|
||||
|
||||
def test_requestrepobuild_withurl(self):
|
||||
self.login(ADMIN_ACCESS_USER)
|
||||
|
||||
# Ensure we are not yet building.
|
||||
json = self.getJsonResponse(RepositoryBuildList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'))
|
||||
|
||||
assert len(json['builds']) == 0
|
||||
|
||||
# Request a (fake) build.
|
||||
self.postResponse(RepositoryBuildList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'),
|
||||
data=dict(archive_url='http://quay.io/robots.txt'),
|
||||
expected_code=201)
|
||||
|
||||
# Check for the build.
|
||||
json = self.getJsonResponse(RepositoryBuildList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'))
|
||||
|
||||
assert len(json['builds']) > 0
|
||||
self.assertEquals('http://quay.io/robots.txt', json['builds'][0]['archive_url'])
|
||||
|
||||
|
||||
def test_requestrepobuild_withfile(self):
|
||||
self.login(ADMIN_ACCESS_USER)
|
||||
|
||||
# Ensure we are not yet building.
|
||||
|
@ -1777,7 +1831,7 @@ class TestRequestRepoBuild(ApiTestCase):
|
|||
|
||||
# Check for the build.
|
||||
json = self.getJsonResponse(RepositoryBuildList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/building'))
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'))
|
||||
|
||||
assert len(json['builds']) > 0
|
||||
|
||||
|
@ -1888,6 +1942,8 @@ class TestRepositoryNotifications(ApiTestCase):
|
|||
self.assertEquals('repo_push', json['event'])
|
||||
self.assertEquals('webhook', json['method'])
|
||||
self.assertEquals('http://example.com', json['config']['url'])
|
||||
self.assertIsNone(json['title'])
|
||||
|
||||
wid = json['uuid']
|
||||
|
||||
# Get the notification.
|
||||
|
@ -1897,6 +1953,7 @@ class TestRepositoryNotifications(ApiTestCase):
|
|||
self.assertEquals(wid, json['uuid'])
|
||||
self.assertEquals('repo_push', json['event'])
|
||||
self.assertEquals('webhook', json['method'])
|
||||
self.assertIsNone(json['title'])
|
||||
|
||||
# Verify the notification is listed.
|
||||
json = self.getJsonResponse(RepositoryNotificationList,
|
||||
|
@ -1915,6 +1972,29 @@ class TestRepositoryNotifications(ApiTestCase):
|
|||
params=dict(repository=ADMIN_ACCESS_USER + '/simple', uuid=wid),
|
||||
expected_code=404)
|
||||
|
||||
# Add another notification.
|
||||
json = self.postJsonResponse(RepositoryNotificationList,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple'),
|
||||
data=dict(config={'url': 'http://example.com'}, event='repo_push',
|
||||
method='webhook', title='Some Notification'),
|
||||
expected_code=201)
|
||||
|
||||
self.assertEquals('repo_push', json['event'])
|
||||
self.assertEquals('webhook', json['method'])
|
||||
self.assertEquals('http://example.com', json['config']['url'])
|
||||
self.assertEquals('Some Notification', json['title'])
|
||||
|
||||
wid = json['uuid']
|
||||
|
||||
# Get the notification.
|
||||
json = self.getJsonResponse(RepositoryNotification,
|
||||
params=dict(repository=ADMIN_ACCESS_USER + '/simple', uuid=wid))
|
||||
|
||||
self.assertEquals(wid, json['uuid'])
|
||||
self.assertEquals('repo_push', json['event'])
|
||||
self.assertEquals('webhook', json['method'])
|
||||
self.assertEquals('Some Notification', json['title'])
|
||||
|
||||
|
||||
class TestListAndGetImage(ApiTestCase):
|
||||
def test_listandgetimages(self):
|
||||
|
@ -2759,7 +2839,7 @@ class FakeBuildTrigger(BuildTriggerHandler):
|
|||
|
||||
return self.config['dockerfile']
|
||||
|
||||
def list_field_values(self, field_name):
|
||||
def list_field_values(self, field_name, limit=None):
|
||||
if field_name == 'test_field':
|
||||
return [1, 2, 3]
|
||||
|
||||
|
|
66
test/test_dockerfileparse.py
Normal file
66
test/test_dockerfileparse.py
Normal file
|
@ -0,0 +1,66 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import unittest
|
||||
|
||||
from util.dockerfileparse import parse_dockerfile
|
||||
|
||||
class TestParsedDockerfile(unittest.TestCase):
|
||||
def test_basic_parse(self):
|
||||
parsed = parse_dockerfile("""
|
||||
FROM someimage:latest
|
||||
RUN dosomething
|
||||
""")
|
||||
|
||||
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||
self.assertEquals("someimage", parsed.get_base_image())
|
||||
|
||||
def test_basic_parse_notag(self):
|
||||
parsed = parse_dockerfile("""
|
||||
FROM someimage
|
||||
RUN dosomething
|
||||
""")
|
||||
|
||||
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||
self.assertEquals("someimage", parsed.get_base_image())
|
||||
|
||||
def test_two_from_lines(self):
|
||||
parsed = parse_dockerfile("""
|
||||
FROM someimage:latest
|
||||
FROM secondimage:second
|
||||
""")
|
||||
|
||||
self.assertEquals(("secondimage", "second"), parsed.get_image_and_tag())
|
||||
self.assertEquals("secondimage", parsed.get_base_image())
|
||||
|
||||
def test_parse_comments(self):
|
||||
parsed = parse_dockerfile("""
|
||||
# FROM someimage:latest
|
||||
FROM anotherimage:foobar # This is a comment
|
||||
RUN dosomething
|
||||
""")
|
||||
|
||||
self.assertEquals(("anotherimage", "foobar"), parsed.get_image_and_tag())
|
||||
self.assertEquals("anotherimage", parsed.get_base_image())
|
||||
|
||||
def test_unicode_parse_as_ascii(self):
|
||||
parsed = parse_dockerfile("""
|
||||
FROM someimage:latest
|
||||
MAINTAINER José Schorr <jschorr@whatever.com>
|
||||
""")
|
||||
|
||||
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||
self.assertEquals("someimage", parsed.get_base_image())
|
||||
|
||||
|
||||
def test_unicode_parse_as_unicode(self):
|
||||
parsed = parse_dockerfile("""
|
||||
FROM someimage:latest
|
||||
MAINTAINER José Schorr <jschorr@whatever.com>
|
||||
""".decode('utf-8'))
|
||||
|
||||
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||
self.assertEquals("someimage", parsed.get_base_image())
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
@ -114,6 +114,9 @@ class JWTAuthTestCase(LiveServerTestCase):
|
|||
self.assertIsNotNone(result)
|
||||
|
||||
# Confirm a user with the same internal and external username.
|
||||
result, _ = self.jwt_auth.confirm_existing_user('cooluser', 'invalidpassword')
|
||||
self.assertIsNone(result)
|
||||
|
||||
result, _ = self.jwt_auth.confirm_existing_user('cooluser', 'password')
|
||||
self.assertIsNotNone(result)
|
||||
self.assertEquals('cooluser', result.username)
|
||||
|
|
|
@ -112,6 +112,17 @@ class TestLDAP(unittest.TestCase):
|
|||
(response, _) = self.ldap.confirm_existing_user('someuser', 'somepass')
|
||||
self.assertEquals(response.username, 'someuser')
|
||||
|
||||
def test_invalid_password(self):
|
||||
# Verify we cannot login with an invalid password.
|
||||
(response, err_msg) = self.ldap.verify_and_link_user('someuser', 'invalidpass')
|
||||
self.assertIsNone(response)
|
||||
self.assertEquals(err_msg, 'Invalid password')
|
||||
|
||||
# Verify we cannot confirm the user.
|
||||
(response, err_msg) = self.ldap.confirm_existing_user('someuser', 'invalidpass')
|
||||
self.assertIsNone(response)
|
||||
self.assertEquals(err_msg, 'Invalid user')
|
||||
|
||||
def test_missing_mail(self):
|
||||
(response, err_msg) = self.ldap.verify_and_link_user('nomail', 'somepass')
|
||||
self.assertIsNone(response)
|
||||
|
|
|
@ -14,37 +14,64 @@ class TestGeneratorFile(unittest.TestCase):
|
|||
|
||||
def test_basic_generator(self):
|
||||
with GeneratorFile(self.sample_generator()) as f:
|
||||
self.assertEquals(0, f.tell())
|
||||
self.assertEquals("thisisatest", f.read())
|
||||
self.assertEquals(len("thisisatest"), f.tell())
|
||||
|
||||
def test_same_lengths(self):
|
||||
with GeneratorFile(self.sample_generator()) as f:
|
||||
self.assertEquals("this", f.read(4))
|
||||
self.assertEquals(4, f.tell())
|
||||
|
||||
self.assertEquals("is", f.read(2))
|
||||
self.assertEquals(6, f.tell())
|
||||
|
||||
self.assertEquals("a", f.read(1))
|
||||
self.assertEquals(7, f.tell())
|
||||
|
||||
self.assertEquals("test", f.read(4))
|
||||
self.assertEquals(11, f.tell())
|
||||
|
||||
def test_indexed_lengths(self):
|
||||
with GeneratorFile(self.sample_generator()) as f:
|
||||
self.assertEquals("thisis", f.read(6))
|
||||
self.assertEquals(6, f.tell())
|
||||
|
||||
self.assertEquals("atest", f.read(5))
|
||||
self.assertEquals(11, f.tell())
|
||||
|
||||
def test_misindexed_lengths(self):
|
||||
with GeneratorFile(self.sample_generator()) as f:
|
||||
self.assertEquals("thisis", f.read(6))
|
||||
self.assertEquals(6, f.tell())
|
||||
|
||||
self.assertEquals("ate", f.read(3))
|
||||
self.assertEquals(9, f.tell())
|
||||
|
||||
self.assertEquals("st", f.read(2))
|
||||
self.assertEquals(11, f.tell())
|
||||
|
||||
self.assertEquals("", f.read(2))
|
||||
self.assertEquals(11, f.tell())
|
||||
|
||||
def test_misindexed_lengths_2(self):
|
||||
with GeneratorFile(self.sample_generator()) as f:
|
||||
self.assertEquals("thisisat", f.read(8))
|
||||
self.assertEquals(8, f.tell())
|
||||
|
||||
self.assertEquals("e", f.read(1))
|
||||
self.assertEquals(9, f.tell())
|
||||
|
||||
self.assertEquals("st", f.read(2))
|
||||
self.assertEquals(11, f.tell())
|
||||
|
||||
self.assertEquals("", f.read(2))
|
||||
self.assertEquals(11, f.tell())
|
||||
|
||||
def test_overly_long(self):
|
||||
with GeneratorFile(self.sample_generator()) as f:
|
||||
self.assertEquals("thisisatest", f.read(60))
|
||||
self.assertEquals(11, f.tell())
|
||||
|
||||
|
||||
class TestUsernameGenerator(unittest.TestCase):
|
||||
|
|
|
@ -51,3 +51,5 @@ class TestConfig(DefaultConfig):
|
|||
LICENSE_EXPIRATION_WARNING = datetime.now() + timedelta(weeks=520)
|
||||
|
||||
FEATURE_GITHUB_BUILD = True
|
||||
|
||||
CLOUDWATCH_NAMESPACE = None
|
||||
|
|
Reference in a new issue