Skip to content

Commit c461a5e

Browse files
committed
feat: add cohesive e2e tests for the web terminal, apps, and workspaces
1 parent 1faed63 commit c461a5e

File tree

27 files changed

+1492
-154
lines changed

27 files changed

+1492
-154
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ site/storybook-static/
2727
site/test-results/*
2828
site/e2e/test-results/*
2929
site/e2e/states/*.json
30+
site/e2e/.auth.json
3031
site/playwright-report/*
3132
site/.swc
3233
site/dist/

cli/server.go

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
820820
for i := int64(0); i < cfg.Provisioner.Daemons.Value(); i++ {
821821
daemonCacheDir := filepath.Join(cacheDir, fmt.Sprintf("provisioner-%d", i))
822822
daemon, err := newProvisionerDaemon(
823-
ctx, coderAPI, provisionerdMetrics, logger, cfg, daemonCacheDir, errCh, false, &provisionerdWaitGroup,
823+
ctx, coderAPI, provisionerdMetrics, logger, cfg, daemonCacheDir, errCh, &provisionerdWaitGroup,
824824
)
825825
if err != nil {
826826
return xerrors.Errorf("create provisioner daemon: %w", err)
@@ -1176,7 +1176,6 @@ func newProvisionerDaemon(
11761176
cfg *codersdk.DeploymentValues,
11771177
cacheDir string,
11781178
errCh chan error,
1179-
dev bool,
11801179
wg *sync.WaitGroup,
11811180
) (srv *provisionerd.Server, err error) {
11821181
ctx, cancel := context.WithCancel(ctx)
@@ -1191,53 +1190,14 @@ func newProvisionerDaemon(
11911190
return nil, xerrors.Errorf("mkdir %q: %w", cacheDir, err)
11921191
}
11931192

1194-
tfDir := filepath.Join(cacheDir, "tf")
1195-
err = os.MkdirAll(tfDir, 0o700)
1196-
if err != nil {
1197-
return nil, xerrors.Errorf("mkdir terraform dir: %w", err)
1198-
}
1199-
1200-
tracer := coderAPI.TracerProvider.Tracer(tracing.TracerName)
1201-
terraformClient, terraformServer := provisionersdk.MemTransportPipe()
1202-
wg.Add(1)
1203-
go func() {
1204-
defer wg.Done()
1205-
<-ctx.Done()
1206-
_ = terraformClient.Close()
1207-
_ = terraformServer.Close()
1208-
}()
1209-
wg.Add(1)
1210-
go func() {
1211-
defer wg.Done()
1212-
defer cancel()
1213-
1214-
err := terraform.Serve(ctx, &terraform.ServeOptions{
1215-
ServeOptions: &provisionersdk.ServeOptions{
1216-
Listener: terraformServer,
1217-
},
1218-
CachePath: tfDir,
1219-
Logger: logger,
1220-
Tracer: tracer,
1221-
})
1222-
if err != nil && !xerrors.Is(err, context.Canceled) {
1223-
select {
1224-
case errCh <- err:
1225-
default:
1226-
}
1227-
}
1228-
}()
1229-
12301193
workDir := filepath.Join(cacheDir, "work")
12311194
err = os.MkdirAll(workDir, 0o700)
12321195
if err != nil {
12331196
return nil, xerrors.Errorf("mkdir work dir: %w", err)
12341197
}
12351198

1236-
provisioners := provisionerd.Provisioners{
1237-
string(database.ProvisionerTypeTerraform): sdkproto.NewDRPCProvisionerClient(terraformClient),
1238-
}
1239-
// include echo provisioner when in dev mode
1240-
if dev {
1199+
provisioners := provisionerd.Provisioners{}
1200+
if cfg.Provisioner.DaemonsEcho {
12411201
echoClient, echoServer := provisionersdk.MemTransportPipe()
12421202
wg.Add(1)
12431203
go func() {
@@ -1260,7 +1220,46 @@ func newProvisionerDaemon(
12601220
}
12611221
}()
12621222
provisioners[string(database.ProvisionerTypeEcho)] = sdkproto.NewDRPCProvisionerClient(echoClient)
1223+
} else {
1224+
tfDir := filepath.Join(cacheDir, "tf")
1225+
err = os.MkdirAll(tfDir, 0o700)
1226+
if err != nil {
1227+
return nil, xerrors.Errorf("mkdir terraform dir: %w", err)
1228+
}
1229+
1230+
tracer := coderAPI.TracerProvider.Tracer(tracing.TracerName)
1231+
terraformClient, terraformServer := provisionersdk.MemTransportPipe()
1232+
wg.Add(1)
1233+
go func() {
1234+
defer wg.Done()
1235+
<-ctx.Done()
1236+
_ = terraformClient.Close()
1237+
_ = terraformServer.Close()
1238+
}()
1239+
wg.Add(1)
1240+
go func() {
1241+
defer wg.Done()
1242+
defer cancel()
1243+
1244+
err := terraform.Serve(ctx, &terraform.ServeOptions{
1245+
ServeOptions: &provisionersdk.ServeOptions{
1246+
Listener: terraformServer,
1247+
},
1248+
CachePath: tfDir,
1249+
Logger: logger,
1250+
Tracer: tracer,
1251+
})
1252+
if err != nil && !xerrors.Is(err, context.Canceled) {
1253+
select {
1254+
case errCh <- err:
1255+
default:
1256+
}
1257+
}
1258+
}()
1259+
1260+
provisioners[string(database.ProvisionerTypeTerraform)] = sdkproto.NewDRPCProvisionerClient(terraformClient)
12631261
}
1262+
12641263
debounce := time.Second
12651264
return provisionerd.New(func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
12661265
// This debounces calls to listen every second. Read the comment

codersdk/deployment.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ type GitAuthConfig struct {
309309

310310
type ProvisionerConfig struct {
311311
Daemons clibase.Int64 `json:"daemons" typescript:",notnull"`
312+
DaemonsEcho clibase.Bool `json:"daemons_echo" typescript:",notnull"`
312313
DaemonPollInterval clibase.Duration `json:"daemon_poll_interval" typescript:",notnull"`
313314
DaemonPollJitter clibase.Duration `json:"daemon_poll_jitter" typescript:",notnull"`
314315
ForceCancelInterval clibase.Duration `json:"force_cancel_interval" typescript:",notnull"`
@@ -1080,6 +1081,17 @@ when required by your organization's security policy.`,
10801081
Group: &deploymentGroupProvisioning,
10811082
YAML: "daemons",
10821083
},
1084+
{
1085+
Name: "Echo Provisioner",
1086+
Description: "Whether to use echo provisioner daemons instead of Terraform. This is for E2E tests.",
1087+
Flag: "provisioner-daemons-echo",
1088+
Env: "CODER_PROVISIONER_DAEMONS_ECHO",
1089+
Hidden: true,
1090+
Default: "false",
1091+
Value: &c.Provisioner.DaemonsEcho,
1092+
Group: &deploymentGroupProvisioning,
1093+
YAML: "daemonsEcho",
1094+
},
10831095
{
10841096
Name: "Poll Interval",
10851097
Description: "Time to wait before polling for a new job.",

examples/templates/docker/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ terraform {
22
required_providers {
33
coder = {
44
source = "coder/coder"
5-
version = "~> 0.7.0"
5+
version = "~> 0.8.3"
66
}
77
docker = {
88
source = "kreuzwerker/docker"

site/.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ storybook-static/
3030
test-results/*
3131
e2e/test-results/*
3232
e2e/states/*.json
33+
e2e/provisionerGenerated.ts
3334
playwright-report/*
3435
.swc
3536
dist/

site/e2e/global.setup.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { test, expect } from "@playwright/test"
2+
import * as constants from "./constants"
3+
import { STORAGE_STATE } from "./playwright.config"
4+
import { Language } from "../src/components/CreateUserForm/CreateUserForm"
5+
6+
test("create first user", async ({ page }) => {
7+
await page.goto("/", { waitUntil: "networkidle" })
8+
9+
await page.getByLabel(Language.usernameLabel).fill(constants.username)
10+
await page.getByLabel(Language.emailLabel).fill(constants.email)
11+
await page.getByLabel(Language.passwordLabel).fill(constants.password)
12+
await page.getByTestId("trial").click()
13+
await page.getByTestId("create").click()
14+
15+
await expect(page).toHaveURL("/workspaces")
16+
17+
await page.context().storageState({ path: STORAGE_STATE })
18+
})

site/e2e/globalSetup.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)