def test_register_feedstock_token_notoken(gh_mock, git_mock, tmp_mock, osuran_mock, secrets_mock, tmpdir, repo): gh_mock.return_value = "abc123" tmp_mock.TemporaryDirectory.return_value.__enter__.return_value = str( tmpdir) secrets_mock.token_hex.return_value = "fgh" osuran_mock.return_value = b"\x80SA" user = "******" project = "bar" os.makedirs(os.path.join(tmpdir, "tokens"), exist_ok=True) pth = os.path.expanduser("~/.conda-smithy/foo_bar.token") token_json_pth = os.path.join(tmpdir, "tokens", "bar.json") try: with pytest.raises(RuntimeError) as e: register_feedstock_token(user, project, repo) finally: if os.path.exists(pth): os.remove(pth) git_mock.Repo.clone_from.assert_not_called() repo = git_mock.Repo.clone_from.return_value repo.index.add.assert_not_called() repo.index.commit.assert_not_called() repo.remote.return_value.pull.assert_not_called() repo.remote.return_value.push.assert_not_called() assert not os.path.exists(token_json_pth) assert "No token found in" in str(e.value)
def test_feedstock_tokens_roundtrip(gh_mock, git_mock, tmp_mock, tmpdir, repo, project): gh_mock.return_value = "abc123" tmp_mock.TemporaryDirectory.return_value.__enter__.return_value = str( tmpdir) user = "******" pth = os.path.expanduser("~/.conda-smithy/foo_%s.token" % project) token_json_pth = os.path.join(tmpdir, "tokens", "%s.json" % project) os.makedirs(os.path.join(tmpdir, "tokens"), exist_ok=True) try: generate_and_write_feedstock_token(user, project) assert os.path.exists(pth) register_feedstock_token(user, project, repo) assert os.path.exists(token_json_pth) with open(pth, "r") as fp: feedstock_token = fp.read().strip() retval = is_valid_feedstock_token(user, project, feedstock_token, repo) finally: if os.path.exists(pth): os.remove(pth) assert retval
def test_register_feedstock_token_works(gh_mock, git_mock, tmp_mock, osuran_mock, secrets_mock, tmpdir, repo): gh_mock.return_value = "abc123" tmp_mock.TemporaryDirectory.return_value.__enter__.return_value = str( tmpdir) secrets_mock.token_hex.return_value = "fgh" osuran_mock.return_value = b"\x80SA" user = "******" project = "bar" os.makedirs(os.path.join(tmpdir, "tokens"), exist_ok=True) pth = os.path.expanduser("~/.conda-smithy/foo_%s.token" % project) token_json_pth = os.path.join(tmpdir, "tokens", "%s.json" % project) try: generate_and_write_feedstock_token(user, project) register_feedstock_token(user, project, repo) finally: if os.path.exists(pth): os.remove(pth) git_mock.Repo.clone_from.assert_called_once_with( "abc123", str(tmpdir), depth=1, ) repo = git_mock.Repo.clone_from.return_value repo.index.add.assert_called_once_with(token_json_pth) repo.index.commit.assert_called_once_with( "[ci skip] [skip ci] [cf admin skip] ***NO_CI*** added token for %s/%s" % (user, project)) repo.remote.return_value.pull.assert_called_once_with(rebase=True) repo.remote.return_value.push.assert_called_once_with() salted_token = scrypt.hash("fgh", b"\x80SA", buflen=256) data = { "salt": b"\x80SA".hex(), "hashed_token": salted_token.hex(), } with open(token_json_pth, "r") as fp: assert json.load(fp) == data
def __call__(self, args): from conda_smithy.feedstock_tokens import ( register_feedstock_token_with_proviers, register_feedstock_token, feedstock_token_exists, ) from conda_smithy.ci_register import drone_default_endpoint drone_endpoints = args.drone_endpoints if drone_endpoints is None: drone_endpoints = [drone_default_endpoint] owner = args.user or args.organization repo = os.path.basename(os.path.abspath(args.feedstock_directory)) if args.token_repo is None: token_repo = ( "https://${GITHUB_TOKEN}@github.com/%s/feedstock-tokens" % owner) else: token_repo = args.token_repo if feedstock_token_exists(owner, repo, token_repo): raise RuntimeError("Token for repo %s/%s already exists!" % (owner, repo)) print("Registering the feedstock tokens. Can take up to ~30 seconds.") # do all providers first register_feedstock_token_with_proviers( owner, repo, drone=args.drone, circle=args.circle, travis=args.travis, azure=args.azure, github_actions=args.github_actions, drone_endpoints=drone_endpoints, ) # then if that works do the github repo register_feedstock_token(owner, repo, token_repo) print("Successfully registered the feedstock token!")
def test_register_feedstock_token_exists_already(gh_mock, git_mock, tmp_mock, osuran_mock, secrets_mock, tmpdir, repo): gh_mock.return_value = "abc123" tmp_mock.TemporaryDirectory.return_value.__enter__.return_value = str( tmpdir) secrets_mock.token_hex.return_value = "fgh" osuran_mock.return_value = b"\x80SA" user = "******" project = "bar" os.makedirs(os.path.join(tmpdir, "tokens"), exist_ok=True) pth = os.path.expanduser("~/.conda-smithy/foo_bar.token") token_json_pth = os.path.join(tmpdir, "tokens", "bar.json") with open(token_json_pth, "w") as fp: fp.write("blarg") try: generate_and_write_feedstock_token(user, project) with pytest.raises(RuntimeError) as e: register_feedstock_token(user, project, repo) finally: if os.path.exists(pth): os.remove(pth) git_mock.Repo.clone_from.assert_called_once_with( "abc123", str(tmpdir), depth=1, ) repo = git_mock.Repo.clone_from.return_value repo.index.add.assert_not_called() repo.index.commit.assert_not_called() repo.remote.return_value.pull.assert_not_called() repo.remote.return_value.push.assert_not_called() assert "Token for repo foo/bar already exists!" in str(e.value)