nil,
						expectedRoute.TTL,
						expectedRoute.RouteServiceUrl,
					)))
			}
		})

		Context("when the routing api returns an error", func() {
			Context("error is not unauthorized error", func() {
				It("returns an error", func() {
					client.RoutesReturns(nil, errors.New("Oops!"))

					err := fetcher.FetchRoutes()
					Expect(err).To(HaveOccurred())
					Expect(err.Error()).To(Equal("Oops!"))
					Expect(tokenFetcher.FetchTokenCallCount()).To(Equal(1))
					Expect(tokenFetcher.FetchTokenArgsForCall(0)).To(BeTrue())
				})
			})

			Context("error is unauthorized error", func() {
				It("returns an error", func() {
					client.RoutesReturns(nil, errors.New("unauthorized"))

					err := fetcher.FetchRoutes()
					Expect(tokenFetcher.FetchTokenCallCount()).To(Equal(2))
					Expect(tokenFetcher.FetchTokenArgsForCall(0)).To(BeTrue())
					Expect(tokenFetcher.FetchTokenArgsForCall(1)).To(BeFalse())
					Expect(client.RoutesCallCount()).To(Equal(2))
					Expect(err).To(HaveOccurred())
					Expect(err.Error()).To(Equal("unauthorized"))
	fake_token_fetcher "github.com/cloudfoundry-incubator/uaa-token-fetcher/fakes"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
)

var _ = Describe(".Register", func() {
	var (
		client       *fake_routing_api.FakeClient
		tokenFetcher *fake_token_fetcher.FakeTokenFetcher
	)

	BeforeEach(func() {
		client = &fake_routing_api.FakeClient{}
		tokenFetcher = &fake_token_fetcher.FakeTokenFetcher{}
		tokenFetcher.FetchTokenReturns(&token_fetcher.Token{AccessToken: "token"}, nil)
	})

	It("registers routes", func() {
		routes := []db.Route{{}}
		commands.Register(client, tokenFetcher, routes)
		Expect(client.UpsertRoutesCallCount()).To(Equal(1))
		Expect(client.UpsertRoutesArgsForCall(0)).To(Equal(routes))
	})

	It("fetches a token", func() {
		routes := []db.Route{{}}
		commands.Register(client, tokenFetcher, routes)
		Expect(tokenFetcher.FetchTokenCallCount()).To(Equal(1))
	})
})
		Context("when fetching the auth token fails", func() {
			It("logs the failure and tries again", func() {
				received := make(chan struct{})

				tokenFetcher.FetchTokenStub = func() (*token_fetcher.Token, error) {
					received <- struct{}{}
					return nil, errors.New("failed to get the token")
				}
				fetcher.StartEventCycle()

				Eventually(received).Should(Receive())
				Eventually(received).Should(Receive())

				Expect(sink.Records()).ToNot(BeNil())
				Expect(sink.Records()[0].Message).To(Equal("failed to get the token"))
				Expect(tokenFetcher.FetchTokenCallCount()).To(Equal(2))
			})
		})

		Context("and the event source successfully subscribes", func() {
			It("responds to events", func() {
				eventSource := fake_routing_api.FakeEventSource{}
				client.SubscribeToEventsReturns(&eventSource, nil)

				received := make(chan struct{})

				eventSource.NextStub = func() (routing_api.Event, error) {
					received <- struct{}{}
					event := routing_api.Event{
						Action: "Delete",
						Route: db.Route{