import com.bazaarvoice.admanagement.api.IntegrationSpec import com.bazaarvoice.admanagement.core.time.UTCDate case class Campaign(id: String, name: String, client: String, totalAdSpend: Int, 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] = ??? } def sumAllSpend(campaignsToSum: List[Campaign]):Int = campaignsToSum.reduce(_.totalAdSpend + _.totalAdSpend) trait CampaignTestObjects { def someCampaign(id: String = "someId", name: String = "someName", client: String = "some_client", totalAdSpend: Int = 123456, startDate: UTCDate = UTCDate(1955, 10, 6), endDate: UTCDate = UTCDate(1956, 10, 6), deleted: Boolean = false): Campaign = Campaign( id = id, name = name, client = client, totalAdSpend = totalAdSpend, startDate = startDate, endDate = endDate, deleted = deleted) } object MyCampaignTestObjects extends CampaignTestObjects { //Any other setup methods for test data } class MyCampaign extends IntegrationSpec { import MyCampaignTestObjects._ val database = new Database it should "properly store a single campaign" in { Given("we store a proper campaign") val campaignToStore = someCampaign() 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") val campaignToStore = someCampaign() 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 campaignToStore = someCampaign(id = "someId") val anotherCampaignToStore = someCampaign(id = "someNewId") 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) } it should "properly sum all totalAdSpend" in { Given("we store several unique campaigns") val campaignToStore = someCampaign(id = "someId") val anotherCampaignToStore = someCampaign(id = "someNewId") val allCampaignsToStore = List(campaignToStore,anotherCampaignToStore) allCampaignsToStore.foreach(campaign => database.storeCampaign(campaign)) When("we sum all ad spend") val totalTotalAdSpend = sumAllSpend(database.fetchAllCampaigns()) Then("the result is the sum of all ad spend") totalTotalAdSpend shouldBe allCampaignsToStore.reduce(_.totalAdSpend + _.totalAdSpend) } }