1package api_test
2
3import (
4	"io/ioutil"
5	"net/http"
6	"net/http/httptest"
7	"sync"
8	"testing"
9	"time"
10
11	"code.cloudfoundry.org/clock/fakeclock"
12	"code.cloudfoundry.org/lager"
13	"code.cloudfoundry.org/lager/lagertest"
14
15	"github.com/concourse/concourse/atc/api"
16	"github.com/concourse/concourse/atc/api/accessor"
17	"github.com/concourse/concourse/atc/api/accessor/accessorfakes"
18	"github.com/concourse/concourse/atc/api/auth"
19	"github.com/concourse/concourse/atc/api/containerserver/containerserverfakes"
20	"github.com/concourse/concourse/atc/api/policychecker/policycheckerfakes"
21	"github.com/concourse/concourse/atc/auditor/auditorfakes"
22	"github.com/concourse/concourse/atc/creds"
23	"github.com/concourse/concourse/atc/creds/credsfakes"
24	"github.com/concourse/concourse/atc/db"
25	"github.com/concourse/concourse/atc/db/dbfakes"
26	"github.com/concourse/concourse/atc/gc/gcfakes"
27	"github.com/concourse/concourse/atc/policy"
28	"github.com/concourse/concourse/atc/worker/workerfakes"
29	"github.com/concourse/concourse/atc/wrappa"
30
31	. "github.com/onsi/ginkgo"
32	. "github.com/onsi/gomega"
33)
34
35var (
36	sink *lager.ReconfigurableSink
37
38	externalURL = "https://example.com"
39	clusterName = "Test Cluster"
40
41	fakeWorkerClient        *workerfakes.FakeClient
42	fakeVolumeRepository    *dbfakes.FakeVolumeRepository
43	fakeContainerRepository *dbfakes.FakeContainerRepository
44	fakeDestroyer           *gcfakes.FakeDestroyer
45	dbTeamFactory           *dbfakes.FakeTeamFactory
46	dbPipelineFactory       *dbfakes.FakePipelineFactory
47	dbJobFactory            *dbfakes.FakeJobFactory
48	dbResourceFactory       *dbfakes.FakeResourceFactory
49	dbResourceConfigFactory *dbfakes.FakeResourceConfigFactory
50	fakePipeline            *dbfakes.FakePipeline
51	fakeAccess              *accessorfakes.FakeAccess
52	fakeAccessor            *accessorfakes.FakeAccessFactory
53	dbWorkerFactory         *dbfakes.FakeWorkerFactory
54	dbWorkerLifecycle       *dbfakes.FakeWorkerLifecycle
55	build                   *dbfakes.FakeBuild
56	dbBuildFactory          *dbfakes.FakeBuildFactory
57	dbUserFactory           *dbfakes.FakeUserFactory
58	dbCheckFactory          *dbfakes.FakeCheckFactory
59	dbTeam                  *dbfakes.FakeTeam
60	dbWall                  *dbfakes.FakeWall
61	fakeSecretManager       *credsfakes.FakeSecrets
62	fakeVarSourcePool       *credsfakes.FakeVarSourcePool
63	fakePolicyChecker       *policycheckerfakes.FakePolicyChecker
64	credsManagers           creds.Managers
65	interceptTimeoutFactory *containerserverfakes.FakeInterceptTimeoutFactory
66	interceptTimeout        *containerserverfakes.FakeInterceptTimeout
67	isTLSEnabled            bool
68	cliDownloadsDir         string
69	logger                  *lagertest.TestLogger
70	fakeClock               *fakeclock.FakeClock
71
72	constructedEventHandler *fakeEventHandlerFactory
73
74	server *httptest.Server
75	client *http.Client
76)
77
78type fakeEventHandlerFactory struct {
79	build db.Build
80
81	lock sync.Mutex
82}
83
84func (f *fakeEventHandlerFactory) Construct(
85	logger lager.Logger,
86	build db.Build,
87) http.Handler {
88	f.lock.Lock()
89	f.build = build
90	f.lock.Unlock()
91
92	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
93		w.WriteHeader(http.StatusOK)
94		_, _ = w.Write([]byte("fake event handler factory was here"))
95	})
96}
97
98var _ = BeforeEach(func() {
99	dbTeamFactory = new(dbfakes.FakeTeamFactory)
100	dbPipelineFactory = new(dbfakes.FakePipelineFactory)
101	dbJobFactory = new(dbfakes.FakeJobFactory)
102	dbResourceFactory = new(dbfakes.FakeResourceFactory)
103	dbResourceConfigFactory = new(dbfakes.FakeResourceConfigFactory)
104	dbBuildFactory = new(dbfakes.FakeBuildFactory)
105	dbUserFactory = new(dbfakes.FakeUserFactory)
106	dbCheckFactory = new(dbfakes.FakeCheckFactory)
107	dbWall = new(dbfakes.FakeWall)
108
109	interceptTimeoutFactory = new(containerserverfakes.FakeInterceptTimeoutFactory)
110	interceptTimeout = new(containerserverfakes.FakeInterceptTimeout)
111	interceptTimeoutFactory.NewInterceptTimeoutReturns(interceptTimeout)
112
113	dbTeam = new(dbfakes.FakeTeam)
114	dbTeam.IDReturns(734)
115	dbTeamFactory.FindTeamReturns(dbTeam, true, nil)
116	dbTeamFactory.GetByIDReturns(dbTeam)
117
118	fakeAccess = new(accessorfakes.FakeAccess)
119	fakeAccessor = new(accessorfakes.FakeAccessFactory)
120	fakeAccessor.CreateReturns(fakeAccess, nil)
121
122	fakePipeline = new(dbfakes.FakePipeline)
123	dbTeam.PipelineReturns(fakePipeline, true, nil)
124
125	dbWorkerFactory = new(dbfakes.FakeWorkerFactory)
126	dbWorkerLifecycle = new(dbfakes.FakeWorkerLifecycle)
127
128	fakeWorkerClient = new(workerfakes.FakeClient)
129
130	fakeVolumeRepository = new(dbfakes.FakeVolumeRepository)
131	fakeContainerRepository = new(dbfakes.FakeContainerRepository)
132	fakeDestroyer = new(gcfakes.FakeDestroyer)
133
134	fakeSecretManager = new(credsfakes.FakeSecrets)
135	fakeVarSourcePool = new(credsfakes.FakeVarSourcePool)
136	credsManagers = make(creds.Managers)
137
138	fakeClock = fakeclock.NewFakeClock(time.Unix(123, 456))
139
140	var err error
141	cliDownloadsDir, err = ioutil.TempDir("", "cli-downloads")
142	Expect(err).NotTo(HaveOccurred())
143
144	constructedEventHandler = &fakeEventHandlerFactory{}
145
146	logger = lagertest.NewTestLogger("api")
147
148	sink = lager.NewReconfigurableSink(lager.NewPrettySink(GinkgoWriter, lager.DEBUG), lager.DEBUG)
149
150	isTLSEnabled = false
151
152	build = new(dbfakes.FakeBuild)
153
154	checkPipelineAccessHandlerFactory := auth.NewCheckPipelineAccessHandlerFactory(dbTeamFactory)
155
156	checkBuildReadAccessHandlerFactory := auth.NewCheckBuildReadAccessHandlerFactory(dbBuildFactory)
157
158	checkBuildWriteAccessHandlerFactory := auth.NewCheckBuildWriteAccessHandlerFactory(dbBuildFactory)
159
160	checkWorkerTeamAccessHandlerFactory := auth.NewCheckWorkerTeamAccessHandlerFactory(dbWorkerFactory)
161
162	fakePolicyChecker = new(policycheckerfakes.FakePolicyChecker)
163	fakePolicyChecker.CheckReturns(policy.PassedPolicyCheck(), nil)
164
165	apiWrapper := wrappa.MultiWrappa{
166		wrappa.NewPolicyCheckWrappa(logger, fakePolicyChecker),
167		wrappa.NewAPIAuthWrappa(
168			checkPipelineAccessHandlerFactory,
169			checkBuildReadAccessHandlerFactory,
170			checkBuildWriteAccessHandlerFactory,
171			checkWorkerTeamAccessHandlerFactory,
172		),
173	}
174
175	handler, err := api.NewHandler(
176		logger,
177
178		externalURL,
179		clusterName,
180
181		apiWrapper,
182
183		dbTeamFactory,
184		dbPipelineFactory,
185		dbJobFactory,
186		dbResourceFactory,
187		dbWorkerFactory,
188		fakeVolumeRepository,
189		fakeContainerRepository,
190		fakeDestroyer,
191		dbBuildFactory,
192		dbCheckFactory,
193		dbResourceConfigFactory,
194		dbUserFactory,
195
196		constructedEventHandler.Construct,
197
198		fakeWorkerClient,
199
200		sink,
201
202		isTLSEnabled,
203
204		cliDownloadsDir,
205		"1.2.3",
206		"4.5.6",
207		fakeSecretManager,
208		fakeVarSourcePool,
209		credsManagers,
210		interceptTimeoutFactory,
211		time.Second,
212		dbWall,
213		fakeClock,
214	)
215
216	Expect(err).NotTo(HaveOccurred())
217
218	accessorHandler := accessor.NewHandler(
219		logger,
220		"some-action",
221		handler,
222		fakeAccessor,
223		new(auditorfakes.FakeAuditor),
224		map[string]string{},
225	)
226
227	handler = wrappa.LoggerHandler{
228		Logger:  logger,
229		Handler: accessorHandler,
230	}
231
232	server = httptest.NewServer(handler)
233
234	client = &http.Client{
235		Transport: &http.Transport{},
236	}
237})
238
239var _ = AfterEach(func() {
240	server.Close()
241})
242
243func TestAPI(t *testing.T) {
244	RegisterFailHandler(Fail)
245	RunSpecs(t, "API Suite")
246}
247