Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c5f1a37

Browse files
authored
feat: Add history middleware parameters (#129)
These will be used for streaming logs, checking status, and other operations related to workspace and project history.
1 parent 78e652a commit c5f1a37

File tree

9 files changed

+455
-4
lines changed

9 files changed

+455
-4
lines changed

database/databasefake/databasefake.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,7 @@ func (q *fakeQuerier) InsertWorkspaceHistory(_ context.Context, arg database.Ins
679679
Transition: arg.Transition,
680680
Initiator: arg.Initiator,
681681
ProvisionJobID: arg.ProvisionJobID,
682+
ProvisionerState: arg.ProvisionerState,
682683
}
683684
q.workspaceHistory = append(q.workspaceHistory, workspaceHistory)
684685
return workspaceHistory, nil

database/query.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,10 +552,11 @@ INSERT INTO
552552
name,
553553
transition,
554554
initiator,
555-
provision_job_id
555+
provision_job_id,
556+
provisioner_state
556557
)
557558
VALUES
558-
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *;
559+
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING *;
559560

560561
-- name: InsertWorkspaceHistoryLogs :many
561562
INSERT INTO

database/query.sql.go

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ require (
3535
go.uber.org/goleak v1.1.12
3636
golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8
3737
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
38+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
3839
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
3940
google.golang.org/protobuf v1.27.1
41+
nhooyr.io/websocket v1.8.7
4042
storj.io/drpc v0.0.29
4143
)
4244

@@ -72,6 +74,7 @@ require (
7274
github.com/hashicorp/terraform-json v0.13.0 // indirect
7375
github.com/imdario/mergo v0.3.12 // indirect
7476
github.com/inconshreveable/mousetrap v1.0.0 // indirect
77+
github.com/klauspost/compress v1.13.6 // indirect
7578
github.com/leodido/go-urn v1.2.1 // indirect
7679
github.com/mattn/go-colorable v0.1.12 // indirect
7780
github.com/mattn/go-isatty v0.0.14 // indirect

go.sum

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,8 @@ github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmx
432432
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
433433
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
434434
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
435+
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
436+
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
435437
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
436438
github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8=
437439
github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
@@ -469,10 +471,13 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh
469471
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
470472
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
471473
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
474+
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
472475
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
473476
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
477+
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
474478
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
475479
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
480+
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
476481
github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0=
477482
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
478483
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
@@ -506,6 +511,9 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe
506511
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
507512
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
508513
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
514+
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
515+
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
516+
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
509517
github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY=
510518
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
511519
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
@@ -631,6 +639,7 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z
631639
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
632640
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
633641
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
642+
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
634643
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
635644
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
636645
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@@ -789,10 +798,12 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
789798
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
790799
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
791800
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
801+
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
792802
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
793803
github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
794804
github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
795805
github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
806+
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
796807
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
797808
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
798809
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -818,6 +829,7 @@ github.com/kylecarbs/terraform-exec v0.15.1-0.20220129210610-65894a884c09/go.mod
818829
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
819830
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
820831
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
832+
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
821833
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
822834
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
823835
github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -1160,6 +1172,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
11601172
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
11611173
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
11621174
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
1175+
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
1176+
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
11631177
github.com/unrolled/secure v1.0.9 h1:BWRuEb1vDrBFFDdbCnKkof3gZ35I/bnHGyt0LB0TNyQ=
11641178
github.com/unrolled/secure v1.0.9/go.mod h1:fO+mEan+FLB0CdEnHf6Q4ZZVNqG+5fuLFnP8p0BXDPI=
11651179
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
@@ -1430,6 +1444,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
14301444
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
14311445
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
14321446
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
1447+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
14331448
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
14341449
golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
14351450
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1932,6 +1947,8 @@ modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
19321947
modernc.org/z v1.0.1-0.20210308123920-1f282aa71362/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA=
19331948
modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA=
19341949
modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4=
1950+
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
1951+
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
19351952
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
19361953
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
19371954
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=

httpmw/projecthistoryparam.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package httpmw
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"errors"
7+
"fmt"
8+
"net/http"
9+
10+
"github.com/go-chi/chi/v5"
11+
12+
"github.com/coder/coder/database"
13+
"github.com/coder/coder/httpapi"
14+
)
15+
16+
type projectHistoryParamContextKey struct{}
17+
18+
// ProjectHistoryParam returns the project history from the ExtractProjectHistoryParam handler.
19+
func ProjectHistoryParam(r *http.Request) database.ProjectHistory {
20+
projectHistory, ok := r.Context().Value(projectHistoryParamContextKey{}).(database.ProjectHistory)
21+
if !ok {
22+
panic("developer error: project history param middleware not provided")
23+
}
24+
return projectHistory
25+
}
26+
27+
// ExtractProjectHistoryParam grabs project history from the "projecthistory" URL parameter.
28+
func ExtractProjectHistoryParam(db database.Store) func(http.Handler) http.Handler {
29+
return func(next http.Handler) http.Handler {
30+
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
31+
project := ProjectParam(r)
32+
projectHistoryName := chi.URLParam(r, "projecthistory")
33+
if projectHistoryName == "" {
34+
httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{
35+
Message: "project history name must be provided",
36+
})
37+
return
38+
}
39+
projectHistory, err := db.GetProjectHistoryByProjectIDAndName(r.Context(), database.GetProjectHistoryByProjectIDAndNameParams{
40+
ProjectID: project.ID,
41+
Name: projectHistoryName,
42+
})
43+
if errors.Is(err, sql.ErrNoRows) {
44+
httpapi.Write(rw, http.StatusNotFound, httpapi.Response{
45+
Message: fmt.Sprintf("project history %q does not exist", projectHistoryName),
46+
})
47+
return
48+
}
49+
if err != nil {
50+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
51+
Message: fmt.Sprintf("get project history: %s", err.Error()),
52+
})
53+
return
54+
}
55+
56+
ctx := context.WithValue(r.Context(), projectHistoryParamContextKey{}, projectHistory)
57+
next.ServeHTTP(rw, r.WithContext(ctx))
58+
})
59+
}
60+
}

httpmw/projecthistoryparam_test.go

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package httpmw_test
2+
3+
import (
4+
"context"
5+
"crypto/sha256"
6+
"fmt"
7+
"net/http"
8+
"net/http/httptest"
9+
"testing"
10+
"time"
11+
12+
"github.com/go-chi/chi/v5"
13+
"github.com/google/uuid"
14+
"github.com/stretchr/testify/require"
15+
16+
"github.com/coder/coder/cryptorand"
17+
"github.com/coder/coder/database"
18+
"github.com/coder/coder/database/databasefake"
19+
"github.com/coder/coder/httpmw"
20+
)
21+
22+
func TestProjectHistoryParam(t *testing.T) {
23+
t.Parallel()
24+
25+
setupAuthentication := func(db database.Store) (*http.Request, database.Project) {
26+
var (
27+
id, secret = randomAPIKeyParts()
28+
hashed = sha256.Sum256([]byte(secret))
29+
)
30+
r := httptest.NewRequest("GET", "/", nil)
31+
r.AddCookie(&http.Cookie{
32+
Name: httpmw.AuthCookie,
33+
Value: fmt.Sprintf("%s-%s", id, secret),
34+
})
35+
userID, err := cryptorand.String(16)
36+
require.NoError(t, err)
37+
username, err := cryptorand.String(8)
38+
require.NoError(t, err)
39+
user, err := db.InsertUser(r.Context(), database.InsertUserParams{
40+
ID: userID,
41+
42+
Name: "example",
43+
LoginType: database.LoginTypeBuiltIn,
44+
HashedPassword: hashed[:],
45+
Username: username,
46+
CreatedAt: database.Now(),
47+
UpdatedAt: database.Now(),
48+
})
49+
require.NoError(t, err)
50+
_, err = db.InsertAPIKey(r.Context(), database.InsertAPIKeyParams{
51+
ID: id,
52+
UserID: user.ID,
53+
HashedSecret: hashed[:],
54+
LastUsed: database.Now(),
55+
ExpiresAt: database.Now().Add(time.Minute),
56+
})
57+
require.NoError(t, err)
58+
orgID, err := cryptorand.String(16)
59+
require.NoError(t, err)
60+
organization, err := db.InsertOrganization(r.Context(), database.InsertOrganizationParams{
61+
ID: orgID,
62+
Name: "banana",
63+
Description: "wowie",
64+
CreatedAt: database.Now(),
65+
UpdatedAt: database.Now(),
66+
})
67+
require.NoError(t, err)
68+
_, err = db.InsertOrganizationMember(r.Context(), database.InsertOrganizationMemberParams{
69+
OrganizationID: orgID,
70+
UserID: user.ID,
71+
CreatedAt: database.Now(),
72+
UpdatedAt: database.Now(),
73+
})
74+
require.NoError(t, err)
75+
project, err := db.InsertProject(context.Background(), database.InsertProjectParams{
76+
ID: uuid.New(),
77+
OrganizationID: organization.ID,
78+
Name: "moo",
79+
})
80+
require.NoError(t, err)
81+
82+
ctx := chi.NewRouteContext()
83+
ctx.URLParams.Add("organization", organization.Name)
84+
ctx.URLParams.Add("project", project.Name)
85+
r = r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, ctx))
86+
return r, project
87+
}
88+
89+
t.Run("None", func(t *testing.T) {
90+
t.Parallel()
91+
db := databasefake.New()
92+
rtr := chi.NewRouter()
93+
rtr.Use(
94+
httpmw.ExtractAPIKey(db, nil),
95+
httpmw.ExtractOrganizationParam(db),
96+
httpmw.ExtractProjectParam(db),
97+
httpmw.ExtractProjectHistoryParam(db),
98+
)
99+
rtr.Get("/", nil)
100+
r, _ := setupAuthentication(db)
101+
rw := httptest.NewRecorder()
102+
rtr.ServeHTTP(rw, r)
103+
104+
res := rw.Result()
105+
defer res.Body.Close()
106+
require.Equal(t, http.StatusBadRequest, res.StatusCode)
107+
})
108+
109+
t.Run("NotFound", func(t *testing.T) {
110+
t.Parallel()
111+
db := databasefake.New()
112+
rtr := chi.NewRouter()
113+
rtr.Use(
114+
httpmw.ExtractAPIKey(db, nil),
115+
httpmw.ExtractOrganizationParam(db),
116+
httpmw.ExtractProjectParam(db),
117+
httpmw.ExtractProjectHistoryParam(db),
118+
)
119+
rtr.Get("/", nil)
120+
121+
r, _ := setupAuthentication(db)
122+
chi.RouteContext(r.Context()).URLParams.Add("projecthistory", "nothin")
123+
rw := httptest.NewRecorder()
124+
rtr.ServeHTTP(rw, r)
125+
126+
res := rw.Result()
127+
defer res.Body.Close()
128+
require.Equal(t, http.StatusNotFound, res.StatusCode)
129+
})
130+
131+
t.Run("ProjectHistory", func(t *testing.T) {
132+
t.Parallel()
133+
db := databasefake.New()
134+
rtr := chi.NewRouter()
135+
rtr.Use(
136+
httpmw.ExtractAPIKey(db, nil),
137+
httpmw.ExtractOrganizationParam(db),
138+
httpmw.ExtractProjectParam(db),
139+
httpmw.ExtractProjectHistoryParam(db),
140+
)
141+
rtr.Get("/", func(rw http.ResponseWriter, r *http.Request) {
142+
_ = httpmw.ProjectHistoryParam(r)
143+
rw.WriteHeader(http.StatusOK)
144+
})
145+
146+
r, project := setupAuthentication(db)
147+
projectHistory, err := db.InsertProjectHistory(context.Background(), database.InsertProjectHistoryParams{
148+
ID: uuid.New(),
149+
ProjectID: project.ID,
150+
Name: "moo",
151+
})
152+
require.NoError(t, err)
153+
chi.RouteContext(r.Context()).URLParams.Add("projecthistory", projectHistory.Name)
154+
rw := httptest.NewRecorder()
155+
rtr.ServeHTTP(rw, r)
156+
157+
res := rw.Result()
158+
defer res.Body.Close()
159+
require.Equal(t, http.StatusOK, res.StatusCode)
160+
})
161+
}

0 commit comments

Comments
 (0)