Skip to content

Commit ecbe17b

Browse files
authored
Merge pull request #78 from hmrc/BDOG-238
BDOG-238 Ensure all shuttered services appear, even without events, b…
2 parents c596668 + d271ac2 commit ecbe17b

File tree

3 files changed

+59
-14
lines changed

3 files changed

+59
-14
lines changed

app/uk/gov/hmrc/cataloguefrontend/shuttering/ShutterService.scala

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,21 @@ class ShutterService @Inject()(
4343
def outagePageByAppAndEnv(serviceName: String, env: Environment)(implicit hc: HeaderCarrier): Future[Option[OutagePage]] =
4444
shutterConnector.outagePageByAppAndEnv(serviceName, env)
4545

46-
def findCurrentState(env: Environment)(implicit hc: HeaderCarrier): Future[Seq[ShutterStateChangeEvent]] =
46+
47+
def findCurrentState(env: Environment)(implicit hc: HeaderCarrier): Future[Seq[ShutterStateData]] =
4748
for {
49+
states <- shutterConnector.shutterStates
4850
events <- shutterConnector.latestShutterEvents(env)
49-
sorted = events.sortWith {
50-
case (l, r) => l.status == ShutterStatusValue.Shuttered ||
51+
status = states.map { state =>
52+
ShutterStateData(
53+
serviceName = state.name
54+
, environment = env
55+
, status = state.statusFor(env)
56+
, lastEvent = events.find(_.serviceName == state.name)
57+
)
58+
}
59+
sorted = status.sortWith {
60+
case (l, r) => l.status == ShutterStatusValue.Shuttered ||
5161
l.serviceName < r.serviceName
5262
}
5363
} yield sorted
@@ -99,3 +109,10 @@ class ShutterService @Inject()(
99109
def shutterGroups: Future[Seq[ShutterGroup]] =
100110
shutterGroupsConnector.shutterGroups
101111
}
112+
113+
case class ShutterStateData(
114+
serviceName: String
115+
, environment: Environment
116+
, status : ShutterStatus
117+
, lastEvent : Option[ShutterStateChangeEvent]
118+
)

app/views/shuttering/ShutterStatePage.scala.html

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
* limitations under the License.
1515
*@
1616

17-
@import uk.gov.hmrc.cataloguefrontend.shuttering.{Environment, EventData, ShutterStatusValue, ShutterStateChangeEvent}
17+
@import uk.gov.hmrc.cataloguefrontend.shuttering.{Environment, EventData, ShutterStatusValue, ShutterStateData}
1818
@import uk.gov.hmrc.cataloguefrontend.ViewMessages
1919
@import java.time.ZoneId
2020
@import java.time.format.DateTimeFormatter
2121

2222
@this(viewMessages: ViewMessages)
2323

24-
@( shutterStates: Seq[ShutterStateChangeEvent]
24+
@( shutterStates: Seq[ShutterStateData]
2525
, selectedEnv : Environment
2626
, isSignedIn : Boolean
2727
)(implicit request: Request[_])
@@ -48,7 +48,7 @@ <h1>Shutter Status: @selectedEnv.toString</h1>
4848
<tr>
4949
<th>Service</th>
5050
<th>Status</th>
51-
<th>Shuttered by</th>
51+
<th>Last updated by</th>
5252
<th>Date</th>
5353
@if(isSignedIn) { <th>Update</th> }
5454
</tr>
@@ -85,16 +85,16 @@ <h1>Shutter Status: @selectedEnv.toString</h1>
8585
}
8686
}
8787

88-
@shutterRow(event: ShutterStateChangeEvent) = {
89-
<tr class="shutter-row @classFor(event.status.value)">
90-
<td class="shutter-service">@event.serviceName</td>
91-
<td class="shutter-state">@event.status.value</td>
92-
<td class="shutter-user">@event.username</td>
93-
<td class="shutter-date">@DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:SS z").withZone(ZoneId.systemDefault).format(event.timestamp)</td>
88+
@shutterRow(state: ShutterStateData) = {
89+
<tr class="shutter-row @classFor(state.status.value)">
90+
<td class="shutter-service">@state.serviceName</td>
91+
<td class="shutter-state">@state.status.value</td>
92+
<td class="shutter-user">@state.lastEvent.map(_.username).getOrElse("")</td>
93+
<td class="shutter-date">@state.lastEvent.map(e => DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:SS z").withZone(ZoneId.systemDefault).format(e.timestamp)).getOrElse("")</td>
9494
@if(isSignedIn) {
9595
<td>
96-
<a id="shutter-link" href="@uk.gov.hmrc.cataloguefrontend.shuttering.routes.ShutterServiceController.step1Get(Some(event.environment.asString), Some(event.serviceName))">
97-
@changeValueFor(event.status.value)
96+
<a id="shutter-link" href="@uk.gov.hmrc.cataloguefrontend.shuttering.routes.ShutterServiceController.step1Get(Some(state.environment.asString), Some(state.serviceName))">
97+
@changeValueFor(state.status.value)
9898
</a>
9999
</td>
100100
}

test/uk/gov/hmrc/cataloguefrontend/shuttering/ShutterServiceSpec.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,33 @@ import scala.concurrent.duration.Duration
3131

3232
class ShutterServiceSpec extends WordSpec with MockitoSugar with Matchers {
3333

34+
val mockShutterStates = Seq(
35+
ShutterState(
36+
name = "abc-frontend"
37+
, production = ShutterStatus.Shuttered(reason = None, outageMessage = None)
38+
, staging = ShutterStatus.Unshuttered
39+
, qa = ShutterStatus.Unshuttered
40+
, externalTest = ShutterStatus.Unshuttered
41+
, development = ShutterStatus.Unshuttered
42+
)
43+
, ShutterState(
44+
name = "zxy-frontend"
45+
, production = ShutterStatus.Unshuttered
46+
, staging = ShutterStatus.Unshuttered
47+
, qa = ShutterStatus.Unshuttered
48+
, externalTest = ShutterStatus.Unshuttered
49+
, development = ShutterStatus.Unshuttered
50+
)
51+
, ShutterState(
52+
name = "ijk-frontend"
53+
, production = ShutterStatus.Shuttered(reason = None, outageMessage = None)
54+
, staging = ShutterStatus.Unshuttered
55+
, qa = ShutterStatus.Unshuttered
56+
, externalTest = ShutterStatus.Unshuttered
57+
, development = ShutterStatus.Unshuttered
58+
)
59+
)
60+
3461
val mockEvents = Seq(
3562
ShutterStateChangeEvent(
3663
username = "test.user"
@@ -63,6 +90,7 @@ class ShutterServiceSpec extends WordSpec with MockitoSugar with Matchers {
6390
val boot = Boot.init
6491
implicit val hc = new HeaderCarrier()
6592

93+
when(boot.mockShutterConnector.shutterStates).thenReturn(Future(mockShutterStates))
6694
when(boot.mockShutterConnector.latestShutterEvents(Environment.Production)).thenReturn(Future(mockEvents))
6795

6896
val Seq(a,b,c) = Await.result(boot.shutterService.findCurrentState(Environment.Production), Duration(10, "seconds"))

0 commit comments

Comments
 (0)