import com.bazaarvoice.admanagement.api.IntegrationSpec import com.bazaarvoice.admanagement.core.time.UTCDate case class Campaign(id: String, name: String, client: String, startDate: UTCDate, endDate: UTCDate, deleted: Boolean) case class UpdateParameters(name: Option[String] = None, client: Option[String] = None, startDate: Option[UTCDate] = None, endDate: Option[UTCDate] = None, deleted: Option[Boolean] = None) class Database { def storeCampaign(campaign: Campaign): Campaign = ??? def fetchCampaign(id: String): Campaign = ??? def updateCampaign(id: String, updateParameters: UpdateParameters): Campaign = ??? def fetchAllCampaigns(): List[Campaign] = ??? } object MyCampaignTestObjects { val campaignToStore = Campaign( id = "someId", name = "someName", client = "someClient", startDate = UTCDate(1955, 10, 6), endDate = UTCDate(1956, 10, 6), deleted = false) } class MyCampaign extends IntegrationSpec { import MyCampaignTestObjects._ val database = new Database it should "properly store a single campaign" in { Given("we store a proper campaign") database.storeCampaign(campaignToStore) When("we fetch a given campaign") val fetchedCampaign: Campaign = database.fetchCampaign("someId") Then("All the campaign values were stored properly") fetchedCampaign.id shouldBe campaignToStore.id fetchedCampaign.name shouldBe campaignToStore.name fetchedCampaign.client shouldBe campaignToStore.client fetchedCampaign.startDate shouldBe campaignToStore.startDate fetchedCampaign.endDate shouldBe campaignToStore.endDate fetchedCampaign.deleted shouldBe campaignToStore.deleted } it should "properly update a single campaign" in { Given("we store a proper campaign") database.storeCampaign(campaignToStore) And("some update parameters for our campaign") val updateParameters = UpdateParameters(name = Some("someNewName")) When("we update this campaign") database.updateCampaign("someId", updateParameters) val fetchedCampaign: Campaign = database.fetchCampaign("someId") Then("All the campaign values were stored properly") //Unchanged values fetchedCampaign.id shouldBe campaignToStore.id fetchedCampaign.client shouldBe campaignToStore.client fetchedCampaign.startDate shouldBe campaignToStore.startDate fetchedCampaign.endDate shouldBe campaignToStore.endDate fetchedCampaign.deleted shouldBe campaignToStore.deleted //Changed values fetchedCampaign.name shouldBe updateParameters.name } it should "properly fetch all stored campaigns" in { Given("we store several unique campaigns") val anotherCampaignToStore = Campaign( id = "someSecondId", name = "someSecondName", client = "someSecondClient", startDate = UTCDate(1955, 10, 6), endDate = UTCDate(1956, 10, 6), deleted = false) database.storeCampaign(campaignToStore) database.storeCampaign(anotherCampaignToStore) When("we fetch all campaigns") val allCampaigns = database.fetchAllCampaigns() Then("all campaigns are returned") allCampaigns shouldBe List(campaignToStore, anotherCampaignToStore) } }