Skip to content

feat: Implement basic e2e scenario #7199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
More cases
  • Loading branch information
mtojek committed Apr 19, 2023
commit 65a0eeca555fee18329a0f6769bed33088744e6a
20 changes: 9 additions & 11 deletions site/e2e/pom/CreateTemplatePage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,32 @@ import { BasePom } from "./BasePom"

export class CreateTemplatePage extends BasePom {
readonly createTemplateForm: Locator
readonly createTemplateButton: Locator
readonly submitButton: Locator

constructor(baseURL: string | undefined, page: Page) {
super(baseURL, `/templates`, page)

this.createTemplateForm = page.getByTestId("form-create-template")
this.createTemplateButton = page.getByTestId("button-create-template")
this.submitButton = page.getByTestId("button-create-template")
}

async loaded() {
await expect(this.page).toHaveTitle("Create Template - Coder")

await this.createTemplateForm.waitFor({ state: "visible" })
await this.createTemplateButton.waitFor({ state: "visible" })
await this.submitButton.waitFor({ state: "visible" })
}

async fillIn() {
await this.createTemplateForm.getByLabel("Name *").fill("my-first-template")
async submitForm() {
await this.createTemplateForm
.getByLabel("Display name")
.fill("My First Template")
.getByTestId("form-template-upload")
.setInputFiles("./e2e/testdata/docker.tar")
await this.createTemplateForm.getByLabel("Name *").fill("my-first-template")
await this.createTemplateForm.getByLabel("Display name").fill("My First Template")
await this.createTemplateForm
.getByLabel("Description")
.fill("This is my first template.")
await this.createTemplateForm
.getByTestId("form-template-upload")
.setInputFiles("./e2e/testdata/docker.tar")

await this.createTemplateButton.click()
await this.submitButton.click()
}
}
27 changes: 27 additions & 0 deletions site/e2e/pom/CreateWorkspacePage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { expect, Locator, Page } from "@playwright/test"
import { BasePom } from "./BasePom"

export class CreateWorkspacePage extends BasePom {
readonly createWorkspaceForm: Locator
readonly submitButton: Locator

constructor(baseURL: string | undefined, page: Page) {
super(baseURL, `/templates/docker/workspace`, page)

this.createWorkspaceForm = page.getByTestId("form-create-workspace")
this.submitButton = page.getByTestId("button-create-workspace")
}

async loaded() {
await expect(this.page).toHaveTitle("Create Workspace - Coder")

await this.createWorkspaceForm.waitFor({ state: "visible" })
await this.submitButton.waitFor({ state: "visible" })
}

async submitForm() {
await this.createWorkspaceForm.getByLabel("Workspace Name").fill("my-first-workspace")

await this.submitButton.click()
}
}
22 changes: 22 additions & 0 deletions site/e2e/pom/TemplatePage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { expect, Locator, Page } from "@playwright/test"
import { BasePom } from "./BasePom"

export class TemplatePage extends BasePom {
readonly createWorkspaceButton: Locator

constructor(baseURL: string | undefined, page: Page) {
super(baseURL, `/templates/docker`, page)

this.createWorkspaceButton = page.getByTestId("button-create-workspace")
}

async loaded() {
await this.createWorkspaceButton.waitFor({ state: "visible" })

await expect(this.page).toHaveTitle("My First Template · Template - Coder")
}

async createWorkspace() {
await this.createWorkspaceButton.click()
}
}
4 changes: 2 additions & 2 deletions site/e2e/pom/TemplatesPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ export class TemplatesPage extends BasePom {
}

async loaded() {
await expect(this.page).toHaveTitle("Templates - Coder")

await this.addTemplateButton.waitFor({ state: "visible" })

await expect(this.page).toHaveTitle("Templates - Coder")
}

async addTemplate() {
Expand Down
22 changes: 22 additions & 0 deletions site/e2e/pom/WorkspacePage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { expect, Locator, Page } from "@playwright/test"
import { BasePom } from "./BasePom"

export class WorkspacePage extends BasePom {
readonly stopWorkspaceButton: Locator

constructor(baseURL: string | undefined, page: Page) {
super(baseURL, `/templates/docker/workspace`, page)

this.stopWorkspaceButton = page.getByTestId("button-stop-workspace")
}

async loaded() {
await this.stopWorkspaceButton.waitFor({ state: "visible" })

await expect(this.page).toHaveTitle("admin/workspace-1 - Coder")
}

async stop() {
await this.stopWorkspaceButton.click()
}
}
2 changes: 0 additions & 2 deletions site/e2e/pom/index.ts

This file was deleted.

23 changes: 22 additions & 1 deletion site/e2e/tests/basicScenario.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@ import { test } from "@playwright/test"
import { getStatePath } from "../helpers"
import { TemplatesPage } from "../pom/TemplatesPage"
import { CreateTemplatePage } from "../pom/CreateTemplatePage"
import { TemplatePage } from "../pom/TemplatePage"
import { CreateWorkspacePage } from "../pom/CreateWorkspacePage"
import { WorkspacePage } from "../pom/WorkspacePage"

test.use({ storageState: getStatePath("authState") })

test("Basic scenario", async ({ page, baseURL }) => {
const templatesPage = new TemplatesPage(baseURL, page)
const createTemplatePage = new CreateTemplatePage(baseURL, page)
const templatePage = new TemplatePage(baseURL, page)
const createWorkspacePage = new CreateWorkspacePage(baseURL, page)
const workspacePage = new WorkspacePage(baseURL, page)

await test.step("Load empty templates page", async () => {
await templatesPage.goto()
Expand All @@ -18,8 +24,23 @@ test("Basic scenario", async ({ page, baseURL }) => {
await templatesPage.addTemplate()
await createTemplatePage.loaded()

await createTemplatePage.fillIn()
await createTemplatePage.submitForm()
await templatePage.loaded()
})

await test.step("Start a workspace", async() => {
await templatePage.createWorkspace()
await createWorkspacePage.loaded()

await createWorkspacePage.submitForm()
await workspacePage.loaded()
})

// await test.step("Workspace is up and running", async() => {
// await workspacePage.isRunning()
// })

await test.step("Finally", async() => {
await page.waitForTimeout(5 * 60 * 1000) // FIXME
})
})
1 change: 1 addition & 0 deletions site/src/components/TemplateLayout/TemplatePageHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ const CreateWorkspaceButton: FC<{
startIcon={<AddCircleOutline />}
component={RouterLink}
to={`/templates/${templateName}/workspace`}
data-testid="button-create-workspace"
>
Create workspace
</Button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,6 @@ export const WorkspaceStatusBadge: FC<
PropsWithChildren<WorkspaceStatusBadgeProps>
> = ({ build, className }) => {
const { text, icon, type } = getStatus(build.status)
return <Pill className={className} icon={icon} text={text} type={type} />
return <Pill className={className} icon={icon} text={text} type={type} data-testid={"workspace-status-" + type }
/>
}
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ export const CreateWorkspacePageView: FC<

return (
<FullPageHorizontalForm title="New workspace" onCancel={props.onCancel}>
<HorizontalForm onSubmit={form.handleSubmit}>
<HorizontalForm onSubmit={form.handleSubmit} data-testid="form-create-workspace">
{/* General info */}
<FormSection
title="General info"
Expand Down Expand Up @@ -383,6 +383,7 @@ export const CreateWorkspacePageView: FC<
onCancel={props.onCancel}
isLoading={props.creatingWorkspace}
submitLabel={t("createWorkspace")}
submitTestId="button-create-workspace"
/>
</HorizontalForm>
</FullPageHorizontalForm>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export const TemplateSummaryPageView: FC<TemplateSummaryPageViewProps> = ({
<Stack spacing={4}>
<TemplateStats template={template} activeVersion={activeVersion} />
{daus && <DAUChart daus={daus} />}
<TemplateResourcesTable resources={getStartedResources(resources)} />
<TemplateResourcesTable resources={getStartedResources(resources)}/>
</Stack>
)
}
Expand Down