@@ -2,8 +2,14 @@ package coderd_test
22
33import (
44 "context"
5+ "crypto/x509"
6+ "database/sql"
57 "io"
8+ "net"
69 "net/http"
10+ "net/http/httptest"
11+ "net/url"
12+ "os"
713 "strconv"
814 "strings"
915 "testing"
@@ -14,10 +20,23 @@ import (
1420 "github.com/stretchr/testify/require"
1521 "go.uber.org/goleak"
1622 "golang.org/x/xerrors"
23+ "google.golang.org/api/idtoken"
24+ "google.golang.org/api/option"
25+
26+ "cdr.dev/slog"
27+ "cdr.dev/slog/sloggers/slogtest"
1728
1829 "github.com/coder/coder/buildinfo"
30+ "github.com/coder/coder/coderd"
31+ "github.com/coder/coder/coderd/autobuild/executor"
1932 "github.com/coder/coder/coderd/coderdtest"
33+ "github.com/coder/coder/coderd/database"
34+ "github.com/coder/coder/coderd/database/databasefake"
35+ "github.com/coder/coder/coderd/database/postgres"
36+ "github.com/coder/coder/coderd/gitsshkey"
2037 "github.com/coder/coder/coderd/rbac"
38+ "github.com/coder/coder/coderd/telemetry"
39+ "github.com/coder/coder/coderd/turnconn"
2140 "github.com/coder/coder/codersdk"
2241 "github.com/coder/coder/provisioner/echo"
2342 "github.com/coder/coder/provisionersdk/proto"
@@ -39,13 +58,96 @@ func TestBuildInfo(t *testing.T) {
3958// TestAuthorizeAllEndpoints will check `authorize` is called on every endpoint registered.
4059func TestAuthorizeAllEndpoints (t * testing.T ) {
4160 t .Parallel ()
42- ctx := context .Background ()
61+ var (
62+ ctx = context .Background ()
63+ authorizer = & fakeAuthorizer {}
64+ )
4365
44- authorizer := & fakeAuthorizer {}
45- client , api := coderdtest .NewWithAPI (t , & coderdtest.Options {
46- Authorizer : authorizer ,
47- IncludeProvisionerD : true ,
48- })
66+ // This function was taken from coderdtest.newWithAPI. It is intentionally
67+ // copied to avoid exposing the API to other tests in coderd. Tests should
68+ // not need a reference to coderd.API...this test is an exception.
69+ newClient := func (authorizer rbac.Authorizer ) (* codersdk.Client , * coderd.API ) {
70+ // This can be hotswapped for a live database instance.
71+ db := databasefake .New ()
72+ pubsub := database .NewPubsubInMemory ()
73+ if os .Getenv ("DB" ) != "" {
74+ connectionURL , closePg , err := postgres .Open ()
75+ require .NoError (t , err )
76+ t .Cleanup (closePg )
77+ sqlDB , err := sql .Open ("postgres" , connectionURL )
78+ require .NoError (t , err )
79+ t .Cleanup (func () {
80+ _ = sqlDB .Close ()
81+ })
82+ err = database .MigrateUp (sqlDB )
83+ require .NoError (t , err )
84+ db = database .New (sqlDB )
85+
86+ pubsub , err = database .NewPubsub (context .Background (), sqlDB , connectionURL )
87+ require .NoError (t , err )
88+ t .Cleanup (func () {
89+ _ = pubsub .Close ()
90+ })
91+ }
92+
93+ tickerCh := make (chan time.Time )
94+ t .Cleanup (func () { close (tickerCh ) })
95+
96+ ctx , cancelFunc := context .WithCancel (context .Background ())
97+ lifecycleExecutor := executor .New (
98+ ctx ,
99+ db ,
100+ slogtest .Make (t , nil ).Named ("autobuild.executor" ).Leveled (slog .LevelDebug ),
101+ tickerCh ,
102+ ).WithStatsChannel (nil )
103+ lifecycleExecutor .Run ()
104+
105+ srv := httptest .NewUnstartedServer (nil )
106+ srv .Config .BaseContext = func (_ net.Listener ) context.Context {
107+ return ctx
108+ }
109+ srv .Start ()
110+ serverURL , err := url .Parse (srv .URL )
111+ require .NoError (t , err )
112+
113+ turnServer , err := turnconn .New (nil )
114+ require .NoError (t , err )
115+
116+ validator , err := idtoken .NewValidator (ctx , option .WithoutAuthentication ())
117+ require .NoError (t , err )
118+
119+ // We set the handler after server creation for the access URL.
120+ coderAPI := coderd .New (& coderd.Options {
121+ AgentConnectionUpdateFrequency : 150 * time .Millisecond ,
122+ AccessURL : serverURL ,
123+ Logger : slogtest .Make (t , nil ).Leveled (slog .LevelDebug ),
124+ Database : db ,
125+ Pubsub : pubsub ,
126+
127+ AWSCertificates : nil ,
128+ AzureCertificates : x509.VerifyOptions {},
129+ GithubOAuth2Config : nil ,
130+ GoogleTokenValidator : validator ,
131+ SSHKeygenAlgorithm : gitsshkey .AlgorithmEd25519 ,
132+ TURNServer : turnServer ,
133+ APIRateLimit : 0 ,
134+ Authorizer : authorizer ,
135+ Telemetry : telemetry .NewNoop (),
136+ })
137+ srv .Config .Handler = coderAPI .Handler
138+
139+ _ = coderdtest .NewProvisionerDaemon (t , coderAPI )
140+ t .Cleanup (func () {
141+ cancelFunc ()
142+ _ = turnServer .Close ()
143+ srv .Close ()
144+ _ = coderAPI .Close ()
145+ })
146+
147+ return codersdk .New (serverURL ), coderAPI
148+ }
149+
150+ client , api := newClient (authorizer )
49151 admin := coderdtest .CreateFirstUser (t , client )
50152 // The provisioner will call to coderd and register itself. This is async,
51153 // so we wait for it to occur.
0 commit comments