Skip to content

Commit

Permalink
Merge pull request #642 from hmrc/CTCP-5153
Browse files Browse the repository at this point in the history
CTCP-5153
  • Loading branch information
JSquires91 authored Jul 10, 2024
2 parents 3457e87 + afb4f46 commit c552827
Show file tree
Hide file tree
Showing 8 changed files with 143 additions and 18 deletions.
12 changes: 6 additions & 6 deletions app/viewModels/taskList/Task.scala
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@ abstract class TaskListTask extends Task {

def name(implicit messages: Messages): String = messages {
status match {
case Completed | InProgress | Amended => s"task.$messageKey.edit"
case Error => s"task.$messageKey.amend"
case NotStarted => s"task.$messageKey.add"
case CannotStartYet | Unavailable => s"task.$messageKey"
case Completed | InProgress | Amended => s"task.$messageKey.edit"
case Error => s"task.$messageKey.amend"
case NotStarted => s"task.$messageKey.add"
case CannotStartYet | CannotContinue | Unavailable => s"task.$messageKey"
}
}

Expand All @@ -51,8 +51,8 @@ abstract class TaskListTask extends Task {
title = TaskListItemTitle(name.toText),
status = status.toTaskListItemStatus(id),
href = status match {
case CannotStartYet | Unavailable => None
case _ => Some(href(lrn))
case CannotStartYet | CannotContinue | Unavailable => None
case _ => Some(href(lrn))
}
)
}
Expand Down
18 changes: 13 additions & 5 deletions app/viewModels/taskList/TaskListViewModel.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import models.SubmissionState.{Amendment, GuaranteeAmendment}
import models.{LocalReferenceNumber, SubmissionState, UserAnswers}
import play.api.i18n.Messages
import uk.gov.hmrc.govukfrontend.views.viewmodels.tasklist.TaskListItem
import viewModels.taskList.TaskStatus.Amended
import viewModels.taskList.TaskStatus._

case class TaskListViewModel(tasks: Seq[TaskListTask], submissionState: SubmissionState.Value) {

Expand All @@ -47,10 +47,18 @@ object TaskListViewModel {

def task(section: String, dependentSections: Seq[String] = Nil): Option[Task] = {
val tasks = userAnswers.tasks
val status = tasks.getOrElse(
section,
if ((PreTaskListTask.section +: dependentSections).allCompleted(tasks)) TaskStatus.NotStarted else TaskStatus.CannotStartYet
)

val status = if ((PreTaskListTask.section +: dependentSections).allCompleted(tasks)) {
tasks.getOrElse(section, NotStarted)
} else {
tasks
.get(section)
.fold[TaskStatus](CannotStartYet) {
case InProgress => CannotContinue
case value => value
}
}

Task(section, status)
}

Expand Down
8 changes: 7 additions & 1 deletion app/viewModels/taskList/TaskStatus.scala
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ object TaskStatus {

case object Amended extends TaskStatus {
override def messageKey: String = "taskStatus.amended"

override val tag: String = "govuk-tag--green"
override val jsonString: String = "amended"
}
Expand All @@ -79,6 +78,12 @@ object TaskStatus {
override val jsonString: String = "cannot-start-yet"
}

case object CannotContinue extends TaskStatus {
override def messageKey: String = "taskStatus.cannotContinue"
override val tag: String = "govuk-tag--yellow"
override val jsonString: String = "cannot-continue"
}

case object Unavailable extends TaskStatus {
override def messageKey: String = "taskStatus.completed"
override val tag: String = "govuk-tag--green"
Expand All @@ -97,6 +102,7 @@ object TaskStatus {
case InProgress.jsonString => JsSuccess(InProgress)
case NotStarted.jsonString => JsSuccess(NotStarted)
case CannotStartYet.jsonString => JsSuccess(CannotStartYet)
case CannotContinue.jsonString => JsSuccess(CannotContinue)
case Error.jsonString => JsSuccess(Error)
case Unavailable.jsonString => JsSuccess(Unavailable)
case Amended.jsonString => JsSuccess(Amended)
Expand Down
7 changes: 1 addition & 6 deletions app/viewModels/taskList/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

package viewModels

import viewModels.taskList.TaskStatus.Completed

package object taskList {

implicit class RichDependentSections(dependentSections: Seq[String]) {
Expand All @@ -29,9 +27,6 @@ package object taskList {
implicit class RichDependentSection(dependentSection: String) {

def isCompleted(tasks: Map[String, TaskStatus]): Boolean =
tasks.exists {
case (`dependentSection`, Completed) => true
case _ => false
}
tasks.get(dependentSection).exists(_.isCompleted)
}
}
1 change: 1 addition & 0 deletions conf/messages.en
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ taskStatus.completed = Completed
taskStatus.inProgress = In progress
taskStatus.notStarted = Not started
taskStatus.cannotStartYet = Cannot start yet
taskStatus.cannotContinue = Cannot continue
taskStatus.error = Error
taskStatus.unavailable = Unavailable
taskStatus.amended = Amended
Expand Down
36 changes: 36 additions & 0 deletions test/viewModels/taskList/ItemsTaskSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ package viewModels.taskList

import base.SpecBase
import generators.Generators
import models.LocalReferenceNumber
import org.scalacheck.Arbitrary.arbitrary
import org.scalacheck.Gen
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks
import viewModels.taskList.TaskStatus._

Expand All @@ -30,6 +32,16 @@ class ItemsTaskSpec extends SpecBase with ScalaCheckPropertyChecks with Generato
val task = ItemsTask(CannotStartYet)
task.name mustBe "Items"
}

"when status is CannotContinue" in {
val task = ItemsTask(CannotContinue)
task.name mustBe "Items"
}

"when status is Unavailable" in {
val task = ItemsTask(Unavailable)
task.name mustBe "Items"
}
}

"must be Add items" - {
Expand Down Expand Up @@ -83,4 +95,28 @@ class ItemsTaskSpec extends SpecBase with ScalaCheckPropertyChecks with Generato
}
}
}

"toTaskListItem" - {
"must have a href undefined" - {
"when task has status CannotStartYet, CannotContinue, Unavailable" in {
forAll(Gen.oneOf(CannotStartYet, CannotContinue, Unavailable), arbitrary[LocalReferenceNumber]) {
(taskStatus, lrn) =>
val task = ItemsTask(taskStatus)
val result = task.toTaskListItem(lrn)(messages, frontendAppConfig)
result.href mustBe None
}
}
}

"must have a href defined" - {
"when task status is something else" in {
forAll(Gen.oneOf(Completed, InProgress, NotStarted, Error, Amended)) {
taskStatus =>
val task = ItemsTask(taskStatus)
val result = task.toTaskListItem(lrn)(messages, frontendAppConfig)
result.href.value must endWith(s"/items/$lrn")
}
}
}
}
}
55 changes: 55 additions & 0 deletions test/viewModels/taskList/TaskListViewModelSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,61 @@ class TaskListViewModelSpec extends SpecBase with ScalaCheckPropertyChecks with
itemsTask.href(answers.lrn)(frontendAppConfig) must endWith(s"/items/$lrn")
}
}

"when pre task list, trader details, route details and documents completed, transport details and items in progress" - {
"items must be 'not started'" in {
val tasks = Map(
PreTaskListTask.section -> TaskStatus.Completed,
TraderDetailsTask.section -> TaskStatus.Completed,
RouteDetailsTask.section -> TaskStatus.Completed,
TransportTask.section -> TaskStatus.InProgress,
DocumentsTask.section -> TaskStatus.Completed,
ItemsTask.section -> TaskStatus.InProgress
)
val answers = emptyUserAnswers.copy(tasks = tasks)
val result = new TaskListViewModelProvider().apply(answers)

val itemsTask = result.tasks(4: Int)

itemsTask.name mustBe "Items"
itemsTask.status mustBe TaskStatus.CannotContinue
itemsTask.href(answers.lrn)(frontendAppConfig) must endWith(s"/items/$lrn")
}
}

"when all tasks are in error state" - {
"items must be 'not started'" in {
val tasks = Map(
PreTaskListTask.section -> TaskStatus.Completed,
TraderDetailsTask.section -> TaskStatus.Error,
RouteDetailsTask.section -> TaskStatus.Error,
TransportTask.section -> TaskStatus.Error,
DocumentsTask.section -> TaskStatus.Error,
ItemsTask.section -> TaskStatus.Error,
GuaranteeDetailsTask.section -> TaskStatus.Error
)
val answers = emptyUserAnswers.copy(tasks = tasks)
val result = new TaskListViewModelProvider().apply(answers)

result.tasks.head.name mustBe "Amend trader details"
result.tasks.head.status mustBe TaskStatus.Error

result.tasks(1).name mustBe "Amend route details"
result.tasks(1).status mustBe TaskStatus.Error

result.tasks(2).name mustBe "Amend transport details"
result.tasks(2).status mustBe TaskStatus.Error

result.tasks(3).name mustBe "Amend documents"
result.tasks(3).status mustBe TaskStatus.Error

result.tasks(4: Int).name mustBe "Amend items"
result.tasks(4: Int).status mustBe TaskStatus.Error

result.tasks(5: Int).name mustBe "Amend guarantee details"
result.tasks(5: Int).status mustBe TaskStatus.Error
}
}
}

"showSubmissionButton" - {
Expand Down
24 changes: 24 additions & 0 deletions test/viewModels/taskList/TaskStatusSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ class TaskStatusSpec extends SpecBase with ScalaCheckPropertyChecks with Generat
"when Unavailable" in {
TaskStatus.Unavailable.messageKey mustBe "taskStatus.completed"
}

"when CannotContinue" in {
TaskStatus.CannotContinue.messageKey mustBe "taskStatus.cannotContinue"
}
}

"tag" - {
Expand All @@ -73,6 +77,10 @@ class TaskStatusSpec extends SpecBase with ScalaCheckPropertyChecks with Generat
"when Error" in {
TaskStatus.Error.tag mustBe "govuk-tag--red"
}

"when CannotContinue" in {
TaskStatus.CannotContinue.tag mustBe "govuk-tag--yellow"
}
}

"must serialise to json" - {
Expand All @@ -95,6 +103,7 @@ class TaskStatusSpec extends SpecBase with ScalaCheckPropertyChecks with Generat
val result = Json.toJson[TaskStatus](TaskStatus.CannotStartYet)
result mustBe JsString("cannot-start-yet")
}

"when error" in {
val result = Json.toJson[TaskStatus](TaskStatus.Error)
result mustBe JsString("error")
Expand All @@ -104,6 +113,11 @@ class TaskStatusSpec extends SpecBase with ScalaCheckPropertyChecks with Generat
val result = Json.toJson[TaskStatus](TaskStatus.Unavailable)
result mustBe JsString("unavailable")
}

"when cannot continue" in {
val result = Json.toJson[TaskStatus](TaskStatus.CannotContinue)
result mustBe JsString("cannot-continue")
}
}

"must deserialise from json" - {
Expand All @@ -127,6 +141,11 @@ class TaskStatusSpec extends SpecBase with ScalaCheckPropertyChecks with Generat
result mustBe TaskStatus.CannotStartYet
}

"when cannot-continue" in {
val result = JsString("cannot-continue").as[TaskStatus]
result mustBe TaskStatus.CannotContinue
}

"when error" in {
val result = JsString("error").as[TaskStatus]
result mustBe TaskStatus.Error
Expand All @@ -137,6 +156,11 @@ class TaskStatusSpec extends SpecBase with ScalaCheckPropertyChecks with Generat
result mustBe TaskStatus.Unavailable
}

"when amended" in {
val result = JsString("amended").as[TaskStatus]
result mustBe TaskStatus.Amended
}

"when something else" in {
val result = JsString("foo").validate[TaskStatus]
result mustBe a[JsError]
Expand Down

0 comments on commit c552827

Please sign in to comment.