Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
release-pager/service/src/test/scala/io/pager/lookup/LiveReleaseCheckerSpec.scala
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
98 lines (85 sloc)
4.43 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package io.pager.lookup | |
import io.pager.Generators._ | |
import io.pager.PagerError.NotFound | |
import io.pager.TestCases | |
import io.pager.TestCases.TestScenarios | |
import io.pager.TestData._ | |
import io.pager.client.github.GitHubClient | |
import io.pager.client.telegram.TelegramClient | |
import io.pager.logging.Logger | |
import io.pager.subscription.SubscriptionLogic | |
import zio._ | |
import zio.test.Assertion._ | |
import zio.test.{ DefaultRunnableSpec, _ } | |
import zio.test.mock.Expectation._ | |
import zio.test.mock._ | |
object LiveReleaseCheckerSpec extends DefaultRunnableSpec(LiveReleaseCheckerTestCases.suite) | |
object LiveReleaseCheckerTestCases extends TestCases { | |
val specName: String = "LiveReleaseCheckerSpec" | |
val scenarios: TestScenarios = List( | |
testM("Do not call services if there are no repositories") { | |
val gitHubClientMocks = Expectation.nothing[GitHubClient] | |
val telegramClientMocks = Expectation.nothing[TelegramClient] | |
val subscriptionMocks = | |
(SubscriptionLogic.listRepositories returns value(Map.empty)) *> | |
(SubscriptionLogic.updateVersions(equalTo(Map.empty)) returns unit) | |
scheduleRefreshSpec(subscriptionMocks, telegramClientMocks, gitHubClientMocks) | |
}, | |
testM("Do not bother subscribers if there are no version updates") { | |
checkM(repositoryName) { name => | |
val repositories = Map(name -> Some(finalVersion)) | |
val gitHubClientMocks = GitHubClient.releases(equalTo(name)) returns value(List(finalRelease)) | |
val telegramClientMocks = Expectation.nothing[TelegramClient] | |
val subscriptionMocks = | |
(SubscriptionLogic.listRepositories returns value(repositories)) *> | |
(SubscriptionLogic.updateVersions(equalTo(Map.empty)) returns unit) | |
scheduleRefreshSpec(subscriptionMocks, telegramClientMocks, gitHubClientMocks) | |
} | |
}, | |
testM("Update repository version for the very first time") { | |
checkM(repositoryName) { name => | |
val repositories = Map(name -> None) | |
val gitHubClientMocks = GitHubClient.releases(equalTo(name)) returns value(List(finalRelease)) | |
val telegramClientMocks = TelegramClient.broadcastMessage(equalTo(Set.empty, message(name))) returns unit | |
val subscriptionMocks = | |
(SubscriptionLogic.listRepositories returns value(repositories)) *> | |
(SubscriptionLogic.updateVersions(equalTo(Map(name -> finalVersion))) returns unit) *> | |
(SubscriptionLogic.listSubscribers(equalTo(name)) returns value(Set.empty)) | |
scheduleRefreshSpec(subscriptionMocks, telegramClientMocks, gitHubClientMocks) | |
} | |
}, | |
testM("Notify users about new release") { | |
checkM(repositoryName, chatIds) { | |
case (name, (chatId1, chatId2)) => | |
val repositories = Map(name -> Some(rcVersion)) | |
val subscribers = Set(chatId1, chatId2) | |
val gitHubClientMocks = GitHubClient.releases(equalTo(name)) returns value(releases) | |
val telegramClientMocks = TelegramClient.broadcastMessage(equalTo((subscribers, message(name)))) returns unit | |
val subscriptionMocks = | |
(SubscriptionLogic.listRepositories returns value(repositories)) *> | |
(SubscriptionLogic.updateVersions(equalTo(Map(name -> finalVersion))) returns unit) *> | |
(SubscriptionLogic.listSubscribers(equalTo(name)) returns value(subscribers)) | |
scheduleRefreshSpec(subscriptionMocks, telegramClientMocks, gitHubClientMocks) | |
} | |
}, | |
testM("GitHub client error should be handled") { | |
checkM(repositoryName) { name => | |
val repositories = Map(name -> Some(rcVersion)) | |
val error = NotFound(name.value) | |
val gitHubClientMocks = GitHubClient.releases(equalTo(name)) returns failure(error) | |
val telegramClientMocks = Expectation.nothing[TelegramClient] | |
val subscriptionMocks = (SubscriptionLogic.listRepositories returns value(repositories)) | |
val result = scheduleRefreshSpec(subscriptionMocks, telegramClientMocks, gitHubClientMocks) | |
assertM(result.run, fails(equalTo(error))) | |
} | |
} | |
) | |
def scheduleRefreshSpec( | |
subscriptionMocks: UManaged[SubscriptionLogic], | |
telegramClientMocks: UManaged[TelegramClient], | |
gitHubClientMocks: UManaged[GitHubClient] | |
): Task[TestResult] = | |
(subscriptionMocks &&& telegramClientMocks &&& gitHubClientMocks).map { case ((sl, tc), gc) => ReleaseChecker.Live.make(Logger.Test, gc, tc, sl) } | |
.use(_.scheduleRefresh) | |
.as(assertCompletes) | |
} |