Skip to content

Commit ad5722a

Browse files
committed
clean: Move ToolRepository logic to trait to simplify testing
To avoid repeating the logic of getting a single tool and listing tools (with the risk of having unfaithful tests), I moved the implementation of `listSupportedTools` and `getTool` to the `ToolRepository` trait and added a `protected def allTools` to make `ToolRepositoryMock` behave exactly as the `RemoteToolRepository` when getting or listing tools
1 parent 2ea7a8c commit ad5722a

7 files changed

Lines changed: 24 additions & 36 deletions

File tree

cli/src/main/scala/com/codacy/analysis/cli/CLIError.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ object CLIError {
1919
case AnalyserError.NoActiveToolInConfiguration => CLIError.NoActiveToolInConfiguration
2020
case AnalyserError.NoToolsFoundForFiles => CLIError.NoToolsFoundForFiles
2121
case AnalyserError.FailedToFetchTools(errorMessage) => CLIError.CouldNotGetTools(errorMessage)
22-
case AnalyserError.FailedToFindTool(toolUuid) =>
23-
CLIError.CouldNotGetTools(s"Failure to get tool with UUID: $toolUuid")
2422
case AnalyserError.FailedToListPatterns(toolUuid, errorMessage) =>
2523
CLIError.CouldNotGetTools(s"Failure getting patterns for tool with UUID $toolUuid. Error: $errorMessage")
2624
}

cli/src/test/scala/com/codacy/analysis/cli/ToolSelectorSpec.scala

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,13 @@ class ToolSelectorSpec extends Specification with NoLanguageFeatures {
3737
standalone = false,
3838
hasUIConfiguration = true)
3939

40-
override def listSupportedTools(): Either[AnalyserError, Seq[ToolSpec]] =
41-
Right(
42-
Seq(
43-
getToolSpec("34225275-f79e-4b85-8126-c7512c987c0d", "PyLint", Set(Python)),
44-
getToolSpec("c6273c22-5248-11e5-885d-feff819cdc9f", "Brakeman", Set(Languages.Ruby)),
45-
getToolSpec("724f98da-f616-4e37-9606-f16919137a1e", "Rubocop", Set(Languages.Ruby)),
46-
getToolSpec("38794ba2-94d8-4178-ab99-1f5c1d12760c", "BundlerAudit", Set(Languages.Ruby)),
47-
getToolSpec("cf05f3aa-fd23-4586-8cce-5368917ec3e5", "ESLint", Set(Languages.Javascript))))
40+
override val allTools = Right(
41+
Seq(
42+
getToolSpec("34225275-f79e-4b85-8126-c7512c987c0d", "PyLint", Set(Python)),
43+
getToolSpec("c6273c22-5248-11e5-885d-feff819cdc9f", "Brakeman", Set(Languages.Ruby)),
44+
getToolSpec("724f98da-f616-4e37-9606-f16919137a1e", "Rubocop", Set(Languages.Ruby)),
45+
getToolSpec("38794ba2-94d8-4178-ab99-1f5c1d12760c", "BundlerAudit", Set(Languages.Ruby)),
46+
getToolSpec("cf05f3aa-fd23-4586-8cce-5368917ec3e5", "ESLint", Set(Languages.Javascript))))
4847

4948
override def listPatterns(tool: ToolSpec): Either[AnalyserError, Seq[PatternSpec]] = Right(Seq.empty)
5049

core/src/main/scala/com/codacy/analysis/core/tools/ToolRepository.scala

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,22 @@ import com.codacy.analysis.core.model.{AnalyserError, DuplicationToolSpec, Metri
44

55
trait ToolRepository {
66

7-
def listSupportedTools(): Either[AnalyserError, Seq[ToolSpec]]
7+
protected def allTools: Either[AnalyserError, Seq[ToolSpec]]
8+
9+
def listSupportedTools(): Either[AnalyserError, Seq[ToolSpec]] =
10+
allTools.map(_.filterNot(_.standalone))
11+
12+
def getTool(queryString: String): Either[AnalyserError, ToolSpec] =
13+
allTools.flatMap { toolsSpecs =>
14+
toolsSpecs.find(
15+
tool => tool.shortName.equalsIgnoreCase(queryString) || tool.uuid.equalsIgnoreCase(queryString)) match {
16+
case None => Left(AnalyserError.NonExistingToolInput(queryString))
17+
case Some(tool) if tool.standalone => Left(AnalyserError.StandaloneToolInput(queryString))
18+
case Some(tool) => Right(tool)
19+
}
20+
}
821
def listDuplicationTools(): Either[AnalyserError, Seq[DuplicationToolSpec]]
922
def listMetricsTools(): Either[AnalyserError, Seq[MetricsToolSpec]]
10-
def getTool(queryString: String): Either[AnalyserError, ToolSpec]
1123
def listPatterns(tool: ToolSpec): Either[AnalyserError, Seq[PatternSpec]]
1224

1325
}

core/src/test/scala/com.codacy.analysis.core/ToolRepositoryMock.scala

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ object ToolRepositoryMock extends ToolRepository {
1919
private val brakemanId = "c6273c22-5248-11e5-885d-feff819cdc9f"
2020
private val scalastyleId = "21586cd3-3eaa-4454-878e-ac0211a833c2"
2121

22-
override def listSupportedTools(): Either[AnalyserError, Seq[ToolSpec]] =
22+
override val allTools: Either[AnalyserError, Seq[ToolSpec]] =
2323
Right(
2424
Seq(
2525
ToolSpec(
@@ -103,9 +103,6 @@ object ToolRepositoryMock extends ToolRepository {
103103
standalone = false,
104104
hasUIConfiguration = true)))
105105

106-
override def getTool(uuid: String): Either[AnalyserError, ToolSpec] =
107-
listSupportedTools().flatMap(_.find(_.uuid == uuid).toRight(AnalyserError.FailedToFindTool(uuid)))
108-
109106
private def getSimplePattern(patternId: String): PatternSpec =
110107
PatternSpec(patternId, "Info", "ErrorProne", None, patternId, None, None, enabled = true, None, Seq(), Set())
111108

core/src/test/scala/com.codacy.analysis.core/tools/ToolRepositoryStub.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import com.codacy.analysis.core.model.{AnalyserError, PatternSpec, ToolSpec}
55

66
class ToolRepositoryStub extends ToolRepository {
77

8-
def listSupportedTools(): Either[AnalyserError, Seq[ToolSpec]] = ???
8+
def allTools: Either[AnalyserError, Seq[ToolSpec]] = ???
99
def listDuplicationTools(): Either[AnalyserError, Seq[model.DuplicationToolSpec]] = ???
1010
def listMetricsTools(): Either[AnalyserError, Seq[model.MetricsToolSpec]] = ???
11-
def getTool(uuid: String): Either[AnalyserError, ToolSpec] = ???
1211
def listPatterns(tool: ToolSpec): Either[AnalyserError, Seq[PatternSpec]] = ???
1312

1413
}

model/src/main/scala/com/codacy/analysis/core/model/AnalyserError.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,6 @@ object AnalyserError {
3939
override val message: String = s"Failed to list tools with error: $errorMessage"
4040
}
4141

42-
final case class FailedToFindTool(toolUuid: String) extends AnalyserError {
43-
override val message: String = s"Failed to find tool with UUID: $toolUuid"
44-
}
45-
4642
final case class FailedToListPatterns(toolUuid: String, errorMessage: String) extends AnalyserError {
4743

4844
override val message: String =

toolRepository-remote/src/main/scala/com/codacy/toolRepository/remote/ToolRepositoryRemote.scala

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ToolRepositoryRemote(toolsClient: ToolsClient,
4343
extends ToolRepository {
4444
private val logger: Logger = getLogger
4545

46-
private lazy val allTools: Either[AnalyserError, Seq[ToolSpec]] = {
46+
override lazy val allTools: Either[AnalyserError, Seq[ToolSpec]] = {
4747
val source = PaginatedApiSourceFactory { cursor =>
4848
toolsClient.listTools(cursor).value.map {
4949
case Right(ListToolsResponse.OK(ToolListResponse(data, None | Some(PaginationInfo(None, _, _))))) =>
@@ -110,19 +110,6 @@ class ToolRepositoryRemote(toolsClient: ToolsClient,
110110
}
111111
}
112112

113-
override def listSupportedTools(): Either[AnalyserError, Seq[ToolSpec]] =
114-
allTools.map(_.filterNot(_.standalone))
115-
116-
override def getTool(queryString: String): Either[AnalyserError, ToolSpec] =
117-
allTools.flatMap { toolsSpecs =>
118-
toolsSpecs.find(
119-
tool => tool.shortName.equalsIgnoreCase(queryString) || tool.uuid.equalsIgnoreCase(queryString)) match {
120-
case None => Left(AnalyserError.FailedToFindTool(queryString))
121-
case Some(tool) if tool.standalone => Left(AnalyserError.StandaloneToolInput(queryString))
122-
case Some(tool) => Right(tool)
123-
}
124-
}
125-
126113
private def patternsFromApi(tool: ToolSpec): Either[AnalyserError, Seq[PatternSpec]] = {
127114
val source = PaginatedApiSourceFactory { cursor =>
128115
toolsClient.listPatterns(tool.uuid, cursor = cursor).value.map {

0 commit comments

Comments
 (0)