Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
def test_read_feedstock_token():
    user = "******"
    repo = "foo"
    pth = os.path.expanduser("~/.conda-smithy/bar_foo.token")

    # no token
    token, err = read_feedstock_token(user, repo)
    assert "No token found in" in err
    assert token is None

    # empty
    try:
        os.system("touch " + pth)
        token, err = read_feedstock_token(user, repo)
        assert "Empty token found in" in err
        assert token is None
    finally:
        if os.path.exists(pth):
            os.remove(pth)

    # token ok
    try:
        generate_and_write_feedstock_token(user, repo)
        token, err = read_feedstock_token(user, repo)
        assert err is None
        assert token is not None

    finally:
        if os.path.exists(pth):
            os.remove(pth)
Ejemplo n.º 3
0
def test_register_feedstock_token_with_proviers_error(
    azure_mock,
    travis_mock,
    circle_mock,
    drone_mock,
    provider,
):
    user = "******"
    project = "bar-feedstock"

    pth = os.path.expanduser("~/.conda-smithy/foo_bar-feedstock.token")

    if provider == "drone":
        drone_mock.side_effect = ValueError("blah")
    if provider == "circle":
        circle_mock.side_effect = ValueError("blah")
    if provider == "travis":
        travis_mock.side_effect = ValueError("blah")
    if provider == "azure":
        azure_mock.side_effect = ValueError("blah")

    try:
        generate_and_write_feedstock_token(user, project)
        feedstock_token, _ = read_feedstock_token(user, project)

        with pytest.raises(RuntimeError) as e:
            register_feedstock_token_with_proviers(
                user, project, drone_endpoints=[drone_default_endpoint])

        assert "on %s" % provider in str(e.value)
    finally:
        if os.path.exists(pth):
            os.remove(pth)
Ejemplo n.º 4
0
def test_register_feedstock_token_with_proviers(
    azure_mock,
    travis_mock,
    circle_mock,
    drone_mock,
    drone,
    circle,
    travis,
    azure,
    clobber,
):
    user = "******"
    project = "bar"

    pth = os.path.expanduser("~/.conda-smithy/foo_bar.token")

    try:
        generate_and_write_feedstock_token(user, project)
        feedstock_token, _ = read_feedstock_token(user, project)

        register_feedstock_token_with_proviers(
            user,
            project,
            drone=drone,
            circle=circle,
            travis=travis,
            azure=azure,
            clobber=clobber,
        )

        if drone:
            drone_mock.assert_called_once_with(user, project, feedstock_token,
                                               clobber)
        else:
            drone_mock.assert_not_called()

        if circle:
            circle_mock.assert_called_once_with(user, project, feedstock_token,
                                                clobber)
        else:
            circle_mock.assert_not_called()

        if travis:
            travis_mock.assert_called_once_with(user, project, feedstock_token,
                                                clobber)
        else:
            travis_mock.assert_not_called()

        if azure:
            azure_mock.assert_called_once_with(user, project, feedstock_token,
                                               clobber)
        else:
            azure_mock.assert_not_called()
    finally:
        if os.path.exists(pth):
            os.remove(pth)
Ejemplo n.º 5
0
    def __call__(self, args):
        from conda_smithy.feedstock_tokens import (
            generate_and_write_feedstock_token, )

        owner = args.user or args.organization
        repo = os.path.basename(os.path.abspath(args.feedstock_directory))

        generate_and_write_feedstock_token(owner, repo)
        print(
            "Your feedstock token has been generated at ~/.conda-smithy/%s_%s.token\n"
            "This token is stored in plaintext so be careful!" % (owner, repo))
Ejemplo n.º 6
0
def test_generate_and_write_feedstock_token():
    user = "******"
    repo = "foo"

    pth = os.path.expanduser("~/.conda-smithy/bar_foo.token")

    try:
        generate_and_write_feedstock_token(user, repo)

        assert os.path.exists(pth)

        # we cannot do it twice
        with pytest.raises(RuntimeError):
            generate_and_write_feedstock_token(user, repo)
    finally:
        if os.path.exists(pth):
            os.remove(pth)
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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)