Describe("#Description", func() {
		It("returns the description of a BmsCommand", func() {
			Expect(cmd.Description()).To(Equal("List all bare metals"))
		})
	})

	Describe("#Usage", func() {
		It("returns the usage text of a BmsCommand", func() {
			Expect(cmd.Usage()).To(Equal("bmp bms --deployment[-d] <deployment file>"))
		})
	})

	Describe("#Options", func() {
		It("returns the options of a BmsCommand", func() {
			Expect(cmds.EqualOptions(cmd.Options(), options)).To(BeTrue())

			Expect(cmd.Options().Deployment).ToNot(Equal(""))
			Expect(cmd.Options().Deployment).To(Equal("../../test_fixtures/bmp/deployment.yml"))
		})
	})

	Describe("#Validate", func() {
		It("validates a good BmsCommand", func() {
			validate, err := cmd.Validate()
			Expect(validate).To(BeTrue())
			Expect(err).ToNot(HaveOccurred())
		})

		Context("bad BmsCommand", func() {
			BeforeEach(func() {
	Describe("#Description", func() {
		It("returns the description of a StemcellsCommand", func() {
			Expect(cmd.Description()).To(Equal("List all stemcells"))
		})
	})

	Describe("#Usage", func() {
		It("returns the usage text of a StemcellsCommand", func() {
			Expect(cmd.Usage()).To(Equal("bmp stemcells"))
		})
	})

	Describe("#Options", func() {
		It("returns the options of a StemcellsCommand", func() {
			Expect(cmds.EqualOptions(cmd.Options(), options)).To(BeTrue())
		})
	})

	Describe("#Validate", func() {
		It("validates a good StemcellsCommand", func() {
			validate, err := cmd.Validate()
			Expect(validate).To(BeTrue())
			Expect(err).ToNot(HaveOccurred())
		})
	})

	Describe("#Execute", func() {
		Context("executes a good StemcellsCommand", func() {
			BeforeEach(func() {
				fakeBmpClient.StemcellsResponse.Status = 200
	Describe("#Description", func() {
		It("returns the description of a ProvisioningBaremetalCommand", func() {
			Expect(cmd.Description()).To(Equal(`provisioning a baremetal with specific stemcell, netboot image`))
		})
	})

	Describe("#Usage", func() {
		It("returns the usage text of a ProvisioningBaremetalCommand", func() {
			Expect(cmd.Usage()).To(Equal("bmp provisioning-baremetal --vmprefix <vm-prefix> --stemcell <bm-stemcell> --netbootimage <bm-netboot-image>"))
		})
	})

	Describe("#Options", func() {
		It("returns the options of a ProvisioningBaremetalCommand", func() {
			Expect(cmds.EqualOptions(cmd.Options(), options)).To(BeTrue())
			Expect(cmd.Options().VMPrefix).To(Equal("fake-vmprefix"))
			Expect(cmd.Options().Stemecell).To(Equal("fake-stemcell"))
			Expect(cmd.Options().NetbootImage).To(Equal("fake-netboot-image"))
		})
	})

	Describe("#Validate", func() {
		It("validates a good ProvisioningBaremetalCommand", func() {
			validate, err := cmd.Validate()
			Expect(validate).To(BeTrue())
			Expect(err).ToNot(HaveOccurred())
		})

		Context("when validating a bad ProvisioningBaremetalCommand", func() {
			Context("when no options passed", func() {
	Describe("#Description", func() {
		It("returns the description of a TaskCommand", func() {
			Expect(cmd.Description()).To(Equal(`Show the output of the task: \"option --debug, Get the debug info of the task; --json, show info with JSON format\"`))
		})
	})

	Describe("#Usage", func() {
		It("returns the usage text of a TaskCommand", func() {
			Expect(cmd.Usage()).To(Equal("bmp task <task-id>"))
		})
	})

	Describe("#Options", func() {
		It("returns the options of a TaskCommand", func() {
			Expect(cmds.EqualOptions(cmd.Options(), options)).To(BeTrue())
			Expect(cmd.Options().TaskID).To(Equal(1))
			Expect(cmd.Options().JSON).To(BeFalse())
			Expect(cmd.Options().Debug).To(BeFalse())
		})
	})

	Describe("#Validate", func() {
		It("validates a good TaskCommand", func() {
			validate, err := cmd.Validate()
			Expect(validate).To(BeTrue())
			Expect(err).ToNot(HaveOccurred())
		})

		Context("validates a bad TaskCommand", func() {
			BeforeEach(func() {
	Describe("#Description", func() {
		It("returns the description of a UpdateStateCommand", func() {
			Expect(cmd.Description()).To(Equal(`Update the server state (\"bm.state.new\", \"bm.state.using\", \"bm.state.loading\", \"bm.state.failed\", \"bm.state.deleted\")`))
		})
	})

	Describe("#Usage", func() {
		It("returns the usage text of a UpdateStateCommand", func() {
			Expect(cmd.Usage()).To(Equal("bmp update-state --server <server-id> --state <state>"))
		})
	})

	Describe("#Options", func() {
		It("returns the options of a UpdateStateCommand", func() {
			Expect(cmds.EqualOptions(cmd.Options(), options)).To(BeTrue())
			Expect(cmd.Options().Server).ToNot(Equal(""))
			Expect(cmd.Options().Server).To(Equal("fake-server-id"))
			Expect(cmd.Options().State).ToNot(Equal(""))
			Expect(cmd.Options().State).To(Equal("bm.state.new"))
		})
	})

	Describe("#Validate", func() {
		It("validates a good UpdateStateCommand", func() {
			validate, err := cmd.Validate()
			Expect(validate).To(BeTrue())
			Expect(err).ToNot(HaveOccurred())
		})

		Context("when validating a bad UpdateStateCommand", func() {
	Describe("#Description", func() {
		It("returns the description of a LoginCommand", func() {
			Expect(cmd.Description()).To(Equal("Login to the Bare Metal Provision Server"))
		})
	})

	Describe("#Usage", func() {
		It("returns the usage text of a LoginCommand", func() {
			Expect(cmd.Usage()).To(Equal("bmp login --username[-u] <username> --password[-p] <password>"))
		})
	})

	Describe("#Options", func() {
		It("returns the options of a LoginCommand", func() {
			Expect(cmds.EqualOptions(cmd.Options(), options)).To(BeTrue())

			Expect(cmd.Options().Username).ToNot(Equal(""))
			Expect(cmd.Options().Username).To(Equal("fake-username"))

			Expect(cmd.Options().Password).ToNot(Equal(""))
			Expect(cmd.Options().Password).To(Equal("fake-password"))
		})
	})

	Describe("#Validate", func() {
		It("validates a good LoginCommand", func() {
			validate, err := cmd.Validate()
			Expect(validate).To(BeTrue())
			Expect(err).ToNot(HaveOccurred())
		})