"github.com/cloudfoundry-incubator/ltc/blob_store/s3_blob_store"
	config_package "github.com/cloudfoundry-incubator/ltc/config"
)

var _ = Describe("S3BlobStore", func() {
	var (
		verifier   *s3_blob_store.Verifier
		fakeServer *ghttp.Server
		config     *config_package.Config
	)

	BeforeEach(func() {
		fakeServer = ghttp.NewServer()
		verifier = &s3_blob_store.Verifier{fakeServer.URL()}
		config = config_package.New(nil)
		config.SetS3BlobStore("some-access-key", "some-secret-key", "bucket", "some-region")
	})

	Describe("Verify", func() {
		Context("when the blob store credentials are valid", func() {
			It("returns authorized as true", func() {
				responseBody := `
					 <?xml version="1.0" encoding="UTF-8"?>
					 <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
						 <Name>bucket</Name>
						 <Prefix/>
						 <Marker/>
						 <MaxKeys>1000</MaxKeys>
						 <IsTruncated>false</IsTruncated>
					 </ListBucketResult>
				 `
				Context("when no blob store username is set", func() {
					BeforeEach(func() {
						config.SetBlobStore("blobtarget.com", "8444", "", "")
						Expect(config.Save()).To(Succeed())
					})

					It("only prints the blob store host", func() {
						Expect(outputBuffer).To(test_helpers.SayLine("Droplet store:\tblobtarget.com:8444"))
					})
				})
			})

			Context("when a S3 blob store is targeted", func() {
				BeforeEach(func() {
					config.SetS3BlobStore("access", "secret", "bucket", "region")
					Expect(config.Save()).To(Succeed())
				})

				It("outputs the s3 bucket and region", func() {
					Expect(outputBuffer).To(test_helpers.SayLine("Droplet store:\ts3://bucket (region)"))
				})
			})
		})

		Context("when --domain is pased", func() {
			JustBeforeEach(func() {
				test_helpers.ExecuteCommandWithArgs(targetCommand, []string{"--domain"})
			})

			It("outputs just the target host", func() {
			var config *config_package.Config

			BeforeEach(func() {
				config = config_package.New(nil)
				config.SetBlobStore("some-host", "some-port", "some-user", "some-password")
			})

			It("returns a new DavBlobStore Verifier", func() {
				verifier.Verify(config)
				Expect(fakeDAVVerifier.VerifyCallCount()).To(Equal(1))
				Expect(fakeS3Verifier.VerifyCallCount()).To(Equal(0))
			})
		})

		Context("when an s3 blob store is targeted", func() {
			var config *config_package.Config

			BeforeEach(func() {
				config = config_package.New(nil)
				config.SetS3BlobStore("", "", "some-bucket-name", "")
			})

			It("returns a new S3BlobStore Verifier", func() {
				verifier.Verify(config)
				Expect(fakeS3Verifier.VerifyCallCount()).To(Equal(1))
				Expect(fakeDAVVerifier.VerifyCallCount()).To(Equal(0))
			})
		})
	})
})
		It("returns errors from loading the config", func() {
			testPersister.err = errors.New("Error")

			err := testConfig.Load()
			Expect(err).To(MatchError("Error"))
		})
	})

	Describe("ActiveBlobStore", func() {
		It("defaults to 'dav'", func() {
			Expect(testConfig.ActiveBlobStore().String()).To(Equal("dav"))
		})

		It("reports the active blobstore", func() {
			testConfig.SetS3BlobStore("some-access-key", "some-secret-key", "some-bucket-name", "some-s3-region")
			Expect(testConfig.ActiveBlobStore().String()).To(Equal("s3"))
		})
	})

	Describe("TargetBlob", func() {
		It("sets the blob target", func() {
			testConfig.SetBlobStore("some-host", "7474", "some-username", "some-password")

			Expect(testConfig.BlobStore()).To(Equal(config.BlobStoreConfig{
				Host:     "some-host",
				Port:     "7474",
				Username: "******",
				Password: "******",
			}))
		})