def setUp(self): self.file_creator = FileCreator() self.domain = 'domain' self.domain_owner = 'domain-owner' self.package_format = 'pip' self.repository = 'repository' self.auth_token = 'auth-token' self.expiration = (datetime.now(tzlocal()) + relativedelta(years=1) + relativedelta(months=9)).replace(microsecond=0) self.endpoint = 'https://{domain}-{domainOwner}.codeartifact.aws.' \ 'a2z.com/{format}/{repository}/'.format( domain=self.domain, domainOwner=self.domain_owner, format=self.package_format, repository=self.repository ) self.default_pypi_rc = self.DEFAULT_PYPI_RC_FMT.format( repository_endpoint=self.endpoint, auth_token=self.auth_token) self.subprocess_utils = mock.Mock() self.test_pypi_rc_path = self.file_creator.full_path('pypirc') if not os.path.isdir(os.path.dirname(self.test_pypi_rc_path)): os.makedirs(os.path.dirname(self.test_pypi_rc_path)) self.test_subject = TwineLogin(self.auth_token, self.expiration, self.endpoint, self.subprocess_utils, self.test_pypi_rc_path)
def test_get_pypi_rc_path(self): self.assertEqual(TwineLogin.get_pypi_rc_path(), os.path.join(os.path.expanduser("~"), ".pypirc"))
class TestTwineLogin(unittest.TestCase): DEFAULT_PYPI_RC_FMT = TwineLogin.DEFAULT_PYPI_RC_FMT def setUp(self): self.file_creator = FileCreator() self.domain = 'domain' self.domain_owner = 'domain-owner' self.package_format = 'pip' self.repository = 'repository' self.auth_token = 'auth-token' self.expiration = (datetime.now(tzlocal()) + relativedelta(years=1) + relativedelta(months=9)).replace(microsecond=0) self.endpoint = 'https://{domain}-{domainOwner}.codeartifact.aws.' \ 'a2z.com/{format}/{repository}/'.format( domain=self.domain, domainOwner=self.domain_owner, format=self.package_format, repository=self.repository ) self.default_pypi_rc = self.DEFAULT_PYPI_RC_FMT.format( repository_endpoint=self.endpoint, auth_token=self.auth_token) self.subprocess_utils = mock.Mock() self.test_pypi_rc_path = self.file_creator.full_path('pypirc') if not os.path.isdir(os.path.dirname(self.test_pypi_rc_path)): os.makedirs(os.path.dirname(self.test_pypi_rc_path)) self.test_subject = TwineLogin(self.auth_token, self.expiration, self.endpoint, self.subprocess_utils, self.test_pypi_rc_path) def tearDown(self): self.file_creator.remove_all() def _assert_pypi_rc_has_expected_content(self, pypi_rc_str, server, repo_url=None, username=None, password=None): pypi_rc = RawConfigParser() pypi_rc.readfp(StringIO(pypi_rc_str)) self.assertIn('distutils', pypi_rc.sections()) self.assertIn('index-servers', pypi_rc.options('distutils')) index_servers = pypi_rc.get('distutils', 'index-servers') index_servers = [ index_server.strip() for index_server in index_servers.split('\n') if index_server.strip() != '' ] self.assertIn(server, index_servers) if repo_url or username or password: self.assertIn(server, pypi_rc.sections()) if repo_url: self.assertIn('repository', pypi_rc.options(server)) self.assertEqual(pypi_rc.get(server, 'repository'), repo_url) if username: self.assertIn('username', pypi_rc.options(server)) self.assertEqual(pypi_rc.get(server, 'username'), username) if password: self.assertIn('password', pypi_rc.options(server)) self.assertEqual(pypi_rc.get(server, 'password'), password) def test_get_pypi_rc_path(self): self.assertEqual(TwineLogin.get_pypi_rc_path(), os.path.join(os.path.expanduser("~"), ".pypirc")) def test_login_pypi_rc_not_found_defaults_set(self): self.test_subject.login() with open(self.test_pypi_rc_path) as f: test_pypi_rc_str = f.read() self._assert_pypi_rc_has_expected_content(pypi_rc_str=test_pypi_rc_str, server='codeartifact', repo_url=self.endpoint, username='******', password=self.auth_token) def test_login_dry_run(self): self.test_subject.login(dry_run=True) self.subprocess_utils.check_call.assert_not_called() self.assertFalse(os.path.exists(self.test_pypi_rc_path)) def test_login_existing_pypi_rc_not_clobbered(self): existing_pypi_rc = '''\ [distutils] index-servers= pypi test [pypi] repository: http://www.python.org/pypi/ username: monty password: JgCXIr5xGG [test] repository: http://example.com/test/ username: testusername password: testpassword ''' with open(self.test_pypi_rc_path, 'w+') as f: f.write(existing_pypi_rc) self.test_subject.login() with open(self.test_pypi_rc_path) as f: test_pypi_rc_str = f.read() self._assert_pypi_rc_has_expected_content(pypi_rc_str=test_pypi_rc_str, server='codeartifact', repo_url=self.endpoint, username='******', password=self.auth_token) self._assert_pypi_rc_has_expected_content( pypi_rc_str=test_pypi_rc_str, server='pypi', repo_url='http://www.python.org/pypi/', username='******', password='******') self._assert_pypi_rc_has_expected_content( pypi_rc_str=test_pypi_rc_str, server='test', repo_url='http://example.com/test/', username='******', password='******') def test_login_existing_pypi_rc_with_codeartifact_not_clobbered(self): existing_pypi_rc = '''\ [distutils] index-servers= pypi codeartifact [pypi] repository: http://www.python.org/pypi/ username: monty password: JgCXIr5xGG [codeartifact] repository: https://test-testOwner.codeartifact.aws.a2z.com/pypi/testRepo/ username: aws password: expired_token ''' with open(self.test_pypi_rc_path, 'w+') as f: f.write(existing_pypi_rc) self.test_subject.login() with open(self.test_pypi_rc_path) as f: test_pypi_rc_str = f.read() self._assert_pypi_rc_has_expected_content(pypi_rc_str=test_pypi_rc_str, server='codeartifact', repo_url=self.endpoint, username='******', password=self.auth_token) self._assert_pypi_rc_has_expected_content( pypi_rc_str=test_pypi_rc_str, server='pypi', repo_url='http://www.python.org/pypi/', username='******', password='******') def test_login_existing_invalid_pypi_rc_error(self): # This is an invalid pypirc as the list of servers are expected under # an 'index-servers' option instead of 'servers'. existing_pypi_rc = '''\ [distutils] servers= pypi [pypi] repository: http://www.python.org/pypi/ username: monty password: JgCXIr5xGG ''' with open(self.test_pypi_rc_path, 'w+') as f: f.write(existing_pypi_rc) with open(self.test_pypi_rc_path) as f: original_content = f.read() with self.assertRaises(Exception): self.test_subject.login() # We should just leave the pypirc untouched when it's invalid. with open(self.test_pypi_rc_path) as f: self.assertEqual(f.read(), original_content)