def test_workspacedetail_unknown_workspace(rf):
    project = ProjectFactory()

    request = rf.get("/")

    with pytest.raises(Http404):
        WorkspaceDetail.as_view()(
            request,
            org_slug=project.org.slug,
            project_slug=project.slug,
            workspace_slug="",
        )
def test_workspacedetail_unauthorized(rf):
    workspace = WorkspaceFactory()

    request = rf.get("/")
    request.user = UserFactory()

    response = WorkspaceDetail.as_view(get_github_api=FakeGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200

    # this is false because while the user can view outputs, but they have no
    # Backends with a level 4 URL set up.
    assert not response.context_data["user_can_view_files"]

    assert not response.context_data["user_can_run_jobs"]
    assert not response.context_data["user_can_view_releases"]

    # this is false because:
    # the user is either logged out
    #   OR doesn't have the right permission to see outputs
    #   AND there are no published Snapshots to show the user.
    assert not response.context_data["user_can_view_outputs"]
def test_workspacedetail_authorized_view_snaphots(rf):
    workspace = WorkspaceFactory()
    SnapshotFactory(workspace=workspace, published_at=timezone.now())

    request = rf.get("/")
    request.user = UserFactory()

    response = WorkspaceDetail.as_view(get_github_api=FakeGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200
    assert response.context_data["user_can_view_outputs"]
def test_workspacedetail_authorized_view_releases(rf):
    workspace = WorkspaceFactory()
    ReleaseFactory(workspace=workspace)

    request = rf.get("/")
    request.user = UserFactory()

    response = WorkspaceDetail.as_view(get_github_api=FakeGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200
    assert response.context_data["user_can_view_releases"]
def test_workspacedetail_authorized_view_files(rf):
    backend = BackendFactory(level_4_url="http://test/")
    user = UserFactory(roles=[ProjectCollaborator])
    workspace = WorkspaceFactory()

    BackendMembershipFactory(backend=backend, user=user)

    request = rf.get("/")
    request.user = user

    response = WorkspaceDetail.as_view(get_github_api=FakeGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200
    assert response.context_data["user_can_view_files"]
def test_workspacedetail_with_no_github(rf):
    workspace = WorkspaceFactory()

    request = rf.get("/")
    request.user = UserFactory()

    class BrokenGitHubAPI:
        def get_repo_is_private(self, *args):
            raise requests.HTTPError

    response = WorkspaceDetail.as_view(get_github_api=BrokenGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200

    assert response.context_data["repo_is_private"] is None
def test_workspacedetail_authorized_honeycomb(rf):
    workspace = WorkspaceFactory()
    SnapshotFactory(workspace=workspace, published_at=timezone.now())

    request = rf.get("/")
    request.user = UserFactory(roles=[CoreDeveloper])

    response = WorkspaceDetail.as_view(get_github_api=FakeGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200
    assert "Honeycomb" in response.rendered_content
    assert (
        f"workspace_name%22%2C%22op%22%3A%22%3D%22%2C%22value%22%3A%22{workspace.name}"
        in response.rendered_content
    )
def test_workspacedetail_authorized_run_jobs_with_opensafely_interactive_role(rf):
    workspace = WorkspaceFactory()
    user = UserFactory(roles=[OpensafelyInteractive])

    ProjectMembershipFactory(
        project=workspace.project, user=user, roles=[ProjectDeveloper]
    )

    request = rf.get("/")
    request.user = user

    response = WorkspaceDetail.as_view(get_github_api=FakeGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200
    assert response.context_data["run_jobs_url"] == workspace.get_pick_ref_url()
def test_workspacedetail_authorized_archive_workspaces(rf):
    workspace = WorkspaceFactory()
    user = UserFactory()

    ProjectMembershipFactory(
        project=workspace.project, user=user, roles=[ProjectDeveloper]
    )

    request = rf.get("/")
    request.user = user

    response = WorkspaceDetail.as_view(get_github_api=FakeGitHubAPI)(
        request,
        org_slug=workspace.project.org.slug,
        project_slug=workspace.project.slug,
        workspace_slug=workspace.name,
    )

    assert response.status_code == 200
    assert response.context_data["user_can_archive_workspace"]