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)
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)
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)
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=[]), )
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=[]), )
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=[]), )
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]), )
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=[]), )
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], )