示例#1
0
async def test_get_subscription_missing_blocker_and_data(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    Check with empty string for data
    """
    fake_redis = create_fake_redis_reply({
        b"account_id": b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker": b"",
        b"data": b"",
    })
    mocker.patch("kodiak.event_handlers.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=None)
示例#2
0
async def test_get_subscription_missing_blocker(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    We set subscription_blocker to empty string from the web_api. This should be
    consider equivalent to a missing subscription blocker.
    """
    fake_redis = create_fake_redis_reply({
        b"account_id": b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker": b"",
    })
    mocker.patch("kodiak.event_handlers.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=None)
示例#3
0
async def test_get_subscription_unknown_blocker(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    Handle unknown blocker by allowing user access.
    """
    fake_redis = create_fake_redis_reply({
        b"account_id":
        b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker":
        b"invalid_subscription_blocker",
    })

    mocker.patch("kodiak.event_handlers.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=None)
示例#4
0
async def test_get_subscription_seats_exceeded_invalid_data(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    Handle invalid data gracefully.
    """
    fake_redis = create_fake_redis_reply({
        b"account_id": b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker": b"seats_exceeded",
        b"data": b"*(invalid-data4#",
    })

    mocker.patch("kodiak.event_handlers.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=SeatsExceeded(allowed_user_ids=[]),
    )
示例#5
0
async def test_get_subscription_seats_exceeded_missing_data(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    For backwards compatibility we cannot guarantee that "seats_exceeded" will
    have the data parameter.
    """
    fake_redis = create_fake_redis_reply({
        b"account_id":
        b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker":
        b"seats_exceeded",
    })

    mocker.patch("kodiak.event_handlers.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=SeatsExceeded(allowed_user_ids=[]),
    )
示例#6
0
async def test_get_subscription_seats_exceeded_no_seats(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    When an account has 0 seats we will not have any allowed_user_ids.
    """
    fake_redis = create_fake_redis_reply({
        b"account_id":
        b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker":
        b"seats_exceeded",
        b"data":
        b'{"kind":"seats_exceeded", "allowed_user_ids": []}',
    })
    mocker.patch("kodiak.event_handlers.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=SeatsExceeded(allowed_user_ids=[]),
    )
示例#7
0
async def test_get_subscription_seats_exceeded(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    When a user exceeds their seat we will specify allowed users for those users
    that occupy a seat.
    """
    fake_redis = create_fake_redis_reply({
        b"account_id":
        b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker":
        b"seats_exceeded",
        b"data":
        b'{"kind":"seats_exceeded", "allowed_user_ids": [5234234]}',
    })
    mocker.patch("kodiak.queue.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=SeatsExceeded(allowed_user_ids=[5234234]),
    )
示例#8
0
async def test_get_subscription_seats_exceeded_invalid_kind(
        api_client: Client, mocker: MockFixture,
        mock_get_token_for_install: None) -> None:
    """
    Handle mismatch in subscription_blocker types between data parameter and
    subscription_blocker.
    """
    fake_redis = create_fake_redis_reply({
        b"account_id":
        b"DF5C23EB-585B-4031-B082-7FF951B4DE15",
        b"subscription_blocker":
        b"seats_exceeded",
        b"data":
        b'{"kind":"trial_expired", "allowed_user_ids": [5234234]}',
    })

    mocker.patch("kodiak.event_handlers.get_redis",
                 return_value=wrap_future(fake_redis))
    async with api_client as api_client:
        res = await api_client.get_subscription()
    assert res == Subscription(
        account_id="DF5C23EB-585B-4031-B082-7FF951B4DE15",
        subscription_blocker=SeatsExceeded(allowed_user_ids=[]),
    )
示例#9
0
def block_event() -> EventInfoResponse:
    config = V1(version=1,
                merge=Merge(automerge_label="automerge",
                            method=MergeMethod.squash))
    pr = PullRequest(
        id="e14ff7599399478fb9dbc2dacb87da72",
        number=100,
        author=PullRequestAuthor(login="******", databaseId=49118, type="Bot"),
        mergeStateStatus=MergeStateStatus.BEHIND,
        state=PullRequestState.OPEN,
        mergeable=MergeableState.MERGEABLE,
        isCrossRepository=False,
        labels=["automerge"],
        latest_sha="8d728d017cac4f5ba37533debe65730abe65730a",
        baseRefName="master",
        headRefName="df825f90-9825-424c-a97e-733522027e4c",
        title="Update README.md",
        body="",
        bodyText="",
        bodyHTML="",
        url="https://github.com/delos-corp/hive-mind/pull/324",
    )
    rep_info = RepoInfo(
        merge_commit_allowed=False,
        rebase_merge_allowed=False,
        squash_merge_allowed=True,
        delete_branch_on_merge=True,
        is_private=True,
    )
    branch_protection = BranchProtectionRule(
        requiresApprovingReviews=True,
        requiredApprovingReviewCount=2,
        requiresStatusChecks=True,
        requiredStatusCheckContexts=[
            "ci/circleci: backend_lint",
            "ci/circleci: backend_test",
            "ci/circleci: frontend_lint",
            "ci/circleci: frontend_test",
            "WIP (beta)",
        ],
        requiresStrictStatusChecks=True,
        requiresCommitSignatures=False,
        restrictsPushes=True,
        pushAllowances=NodeListPushAllowance(nodes=[
            PushAllowance(actor=PushAllowanceActor(databaseId=None)),
            PushAllowance(actor=PushAllowanceActor(databaseId=53453)),
        ]),
    )

    return EventInfoResponse(
        config=config,
        config_str="""\
version = 1
[merge]
method = "squash"
""",
        config_file_expression="master:.kodiak.toml",
        head_exists=True,
        pull_request=pr,
        repository=rep_info,
        subscription=Subscription(
            account_id="D1606A79-A1A1-4550-BA7B-C9ED0D792B1E",
            subscription_blocker=None),
        branch_protection=branch_protection,
        review_requests=[
            PRReviewRequest(name="ghost"),
            PRReviewRequest(name="ghost-team"),
            PRReviewRequest(name="ghost-mannequin"),
        ],
        reviews=[
            PRReview(
                createdAt=arrow.get("2019-05-22T15:29:34Z").datetime,
                state=PRReviewState.COMMENTED,
                author=PRReviewAuthor(login="******",
                                      permission=Permission.WRITE),
            ),
            PRReview(
                createdAt=arrow.get("2019-05-22T15:29:52Z").datetime,
                state=PRReviewState.CHANGES_REQUESTED,
                author=PRReviewAuthor(login="******",
                                      permission=Permission.WRITE),
            ),
            PRReview(
                createdAt=arrow.get("2019-05-22T15:30:52Z").datetime,
                state=PRReviewState.COMMENTED,
                author=PRReviewAuthor(login="******",
                                      permission=Permission.ADMIN),
            ),
            PRReview(
                createdAt=arrow.get("2019-05-22T15:43:17Z").datetime,
                state=PRReviewState.APPROVED,
                author=PRReviewAuthor(login="******",
                                      permission=Permission.WRITE),
            ),
            PRReview(
                createdAt=arrow.get("2019-05-23T15:13:29Z").datetime,
                state=PRReviewState.APPROVED,
                author=PRReviewAuthor(login="******",
                                      permission=Permission.WRITE),
            ),
            PRReview(
                createdAt=arrow.get("2019-05-24T10:21:32Z").datetime,
                state=PRReviewState.APPROVED,
                author=PRReviewAuthor(login="******",
                                      permission=Permission.WRITE),
            ),
        ],
        status_contexts=[
            StatusContext(context="ci/circleci: backend_lint",
                          state=StatusState.SUCCESS),
            StatusContext(context="ci/circleci: backend_test",
                          state=StatusState.SUCCESS),
            StatusContext(context="ci/circleci: frontend_lint",
                          state=StatusState.SUCCESS),
            StatusContext(context="ci/circleci: frontend_test",
                          state=StatusState.SUCCESS),
        ],
        check_runs=[
            CheckRun(name="WIP (beta)",
                     conclusion=CheckConclusionState.SUCCESS)
        ],
        valid_signature=True,
        valid_merge_methods=[MergeMethod.squash],
    )