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(uaaClient.FetchTokenCallCount()).To(Equal(1))
					Expect(uaaClient.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(uaaClient.FetchTokenCallCount()).To(Equal(2))
					Expect(uaaClient.FetchTokenArgsForCall(0)).To(BeTrue())
					Expect(uaaClient.FetchTokenArgsForCall(1)).To(BeFalse())
					Expect(client.RoutesCallCount()).To(Equal(2))
					Expect(err).To(HaveOccurred())
					Expect(err.Error()).To(Equal("unauthorized"))
				})
						expectedRoute.LogGuid,
						nil,
						*expectedRoute.TTL,
						expectedRoute.RouteServiceUrl,
						expectedRoute.ModificationTag,
					)))
			}
		})

		It("uses cache when fetching token from UAA", func() {
			client.RoutesReturns(response, nil)

			err := fetcher.FetchRoutes()
			Expect(err).ToNot(HaveOccurred())
			Expect(uaaClient.FetchTokenCallCount()).To(Equal(1))
			Expect(uaaClient.FetchTokenArgsForCall(0)).To(Equal(false))
		})

		Context("when a cached token is invalid", func() {
			BeforeEach(func() {
				count := 0
				client.RoutesStub = func() ([]models.Route, error) {
					if count == 0 {
						count++
						return nil, errors.New("unauthorized")
					} else {
						return response, nil
					}
				}
			})