diff --git a/README.md b/README.md index 06639f1..fa8c90c 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ This should start this service and any dependent services. Once the script has finished, the service will be available on http://localhost:9618/api-test-user +For CTC users, the service will be available on http://localhost:9618/api-test-user/ctc + ## Running tests diff --git a/app/uk/gov/hmrc/testuser/config/ApplicationConfig.scala b/app/uk/gov/hmrc/testuser/config/ApplicationConfig.scala index 56d73d0..95c31b4 100644 --- a/app/uk/gov/hmrc/testuser/config/ApplicationConfig.scala +++ b/app/uk/gov/hmrc/testuser/config/ApplicationConfig.scala @@ -32,4 +32,5 @@ class ApplicationConfig @Inject() (config: Configuration) { lazy val govukHelp: String = urlFooterConfig.getString("govukHelp") lazy val accessibility: String = urlFooterConfig.getString("accessibility") lazy val feedbackSurveyUrl = feedbackSurveyConfig.getString("surveyUrl") + lazy val ctcLoginUrl = config.getOptional[String]("ctc-login-url") } diff --git a/app/uk/gov/hmrc/testuser/controllers/TestUserController.scala b/app/uk/gov/hmrc/testuser/controllers/TestUserController.scala index 3501080..36d1eae 100644 --- a/app/uk/gov/hmrc/testuser/controllers/TestUserController.scala +++ b/app/uk/gov/hmrc/testuser/controllers/TestUserController.scala @@ -32,7 +32,7 @@ import uk.gov.hmrc.testuser.config.ApplicationConfig import uk.gov.hmrc.testuser.connectors.ApiPlatformTestUserConnector import uk.gov.hmrc.testuser.models.{NavLink, UserTypes} import uk.gov.hmrc.testuser.services.{NavigationService, TestUserService} -import uk.gov.hmrc.testuser.views.html.{CreateTestUserView, TestUserView} +import uk.gov.hmrc.testuser.views.html.{CreateTestUserView, CreateTestUserViewCtc, TestUserView, TestUserViewCtc} class TestUserController @Inject() ( override val messagesApi: MessagesApi, @@ -41,7 +41,9 @@ class TestUserController @Inject() ( apiPlatformTestUserConnector: ApiPlatformTestUserConnector, messagesControllerComponents: MessagesControllerComponents, createTestUser: CreateTestUserView, - testUser: TestUserView + createTestUserCtc: CreateTestUserViewCtc, + testUser: TestUserView, + testUserCtc: TestUserViewCtc )(implicit val ec: ExecutionContext, config: ApplicationConfig) extends FrontendController(messagesControllerComponents) with I18nSupport @@ -52,6 +54,10 @@ class TestUserController @Inject() ( Future.successful(Ok(createTestUser(navLinks, CreateUserForm.form))) } + def showCreateUserPageCtc() = headerNavigation { implicit request => navLinks => + Future.successful(Ok(createTestUserCtc(navLinks, CreateUserForm.form))) + } + def createUser() = headerNavigation { implicit request => navLinks => def validForm(form: CreateUserForm) = { UserTypes.from(form.userType.getOrElse("")) match { @@ -66,6 +72,20 @@ class TestUserController @Inject() ( CreateUserForm.form.bindFromRequest().fold(invalidForm, validForm) } + def createUserCtc() = headerNavigation { implicit request => navLinks => + def validForm(form: CreateUserForm) = { + UserTypes.from(form.userType.getOrElse("")) match { + case Some(uType) => testUserService.createUserCtc(uType) map (user => Ok(testUserCtc(navLinks, user))) + case _ => Future.failed(new BadRequestException("Invalid request")) + } + } + + def invalidForm(invalidForm: Form[CreateUserForm]) = { + Future.successful(BadRequest(createTestUserCtc(navLinks, invalidForm))) + } + + CreateUserForm.form.bindFromRequest().fold(invalidForm, validForm) + } private def headerNavigation(f: Request[AnyContent] => Seq[NavLink] => Future[Result]): Action[AnyContent] = { Action.async { implicit request => diff --git a/app/uk/gov/hmrc/testuser/models/FieldDefinitionsProvider.scala b/app/uk/gov/hmrc/testuser/models/FieldDefinitionsProvider.scala index 431bb99..8bd9d3e 100644 --- a/app/uk/gov/hmrc/testuser/models/FieldDefinitionsProvider.scala +++ b/app/uk/gov/hmrc/testuser/models/FieldDefinitionsProvider.scala @@ -42,4 +42,13 @@ object FieldDefinitions { FieldDefinition("individualDetails", "Individual Details", Seq()), FieldDefinition("groupIdentifier", "Group Identifier", Seq(INDIVIDUAL, ORGANISATION)) ) + + def getCtc(): Seq[FieldDefinition] = Seq( + FieldDefinition("eoriNumber", "Economic Operator Registration and Identification (EORI) number", Seq(INDIVIDUAL, ORGANISATION)), + FieldDefinition("userFullName", "Full Name", Seq(INDIVIDUAL, ORGANISATION)), + FieldDefinition("emailAddress", "Email Address", Seq(INDIVIDUAL, ORGANISATION)), + FieldDefinition("organisationDetails", "Organisation Details", Seq(ORGANISATION)), + FieldDefinition("individualDetails", "Individual Details", Seq(INDIVIDUAL)), + FieldDefinition("groupIdentifier", "Group Identifier", Seq(INDIVIDUAL, ORGANISATION)) + ) } diff --git a/app/uk/gov/hmrc/testuser/services/TestUserService.scala b/app/uk/gov/hmrc/testuser/services/TestUserService.scala index 7523dc5..070c459 100644 --- a/app/uk/gov/hmrc/testuser/services/TestUserService.scala +++ b/app/uk/gov/hmrc/testuser/services/TestUserService.scala @@ -33,6 +33,13 @@ class TestUserService @Inject() (apiPlatformTestUserConnector: ApiPlatformTestUs testUser <- createUserWithServices(userType, services) } yield testUser + } + def createUserCtc(userType: UserType)(implicit hc: HeaderCarrier): Future[TestUser] = { + for { + services <- apiPlatformTestUserConnector.getServices() + testUser <- createUserWithServices(userType, services.filter(x => x.key == "common-transit-convention-traders")) + } yield testUser + } private def createUserWithServices(userType: UserType, services: Seq[Service])(implicit hc: HeaderCarrier) = { diff --git a/app/uk/gov/hmrc/testuser/views/CreateTestUserViewCtc.scala.html b/app/uk/gov/hmrc/testuser/views/CreateTestUserViewCtc.scala.html new file mode 100644 index 0000000..7144665 --- /dev/null +++ b/app/uk/gov/hmrc/testuser/views/CreateTestUserViewCtc.scala.html @@ -0,0 +1,115 @@ +@* + * Copyright 2023 HM Revenue & Customs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *@ + +@import uk.gov.hmrc.testuser.models.NavLink +@import uk.gov.hmrc.testuser.controllers.CreateUserForm +@import uk.gov.hmrc.testuser.views.html.includes._ +@import uk.gov.hmrc.testuser.models.FieldDefinitions +@import uk.gov.hmrc.testuser.models.UserTypes.{INDIVIDUAL, ORGANISATION} +@import uk.gov.hmrc.testuser.views.html.govuk_wrapper +@import uk.gov.hmrc.testuser.models.views.FeedbackBanner +@import uk.gov.hmrc.testuser.models.views.GenericFeedbackBanner +@import uk.gov.hmrc.testuser.config.ApplicationConfig + + +@this(govUkWrapper: govuk_wrapper, feedbackBannerView: FeedbackBannerView) + +@(navLinks: Seq[NavLink], form: Form[CreateUserForm], feedbackBanner: Option[FeedbackBanner] = Some(GenericFeedbackBanner))(implicit request: Request[_], messages: Messages, config: ApplicationConfig) + +@govUkWrapper(pageTitle = Some("Create test user - HMRC Developer Hub - GOV.UK"), navLinks = navLinks, feedbackBanner = feedbackBanner) { +
+ A CTC test user is a dummy Government Gateway user ID used for testing NCTS in the sandbox with the CTC enrolment. +
++ A test CTC user ID has: +
++ Test users and other test data are no longer cleared down every two weeks. +
+ + @helper.form(action = uk.gov.hmrc.testuser.controllers.routes.TestUserController.createUserCtc()) { + @helper.CSRF.formField ++ Login to NCTS to manage your movements. +
+} diff --git a/build.sbt b/build.sbt index 79fcabd..9f51780 100644 --- a/build.sbt +++ b/build.sbt @@ -1,16 +1,13 @@ -import play.core.PlayVersion -import play.sbt.PlayImport._ +import bloop.integrations.sbt.BloopDefaults import sbt.Tests.{Group, SubProcess} import uk.gov.hmrc.DefaultBuildSettings import uk.gov.hmrc.DefaultBuildSettings._ import uk.gov.hmrc.SbtAutoBuildPlugin import uk.gov.hmrc.sbtdistributables.SbtDistributablesPlugin import uk.gov.hmrc.sbtdistributables.SbtDistributablesPlugin._ -import uk.gov.hmrc.versioning.SbtGitVersioning import uk.gov.hmrc.versioning.SbtGitVersioning.autoImport.majorVersion import scala.util.Properties -import bloop.integrations.sbt.BloopDefaults lazy val playSettings: Seq[Setting[_]] = Seq.empty lazy val appName = "api-platform-test-user-frontend" diff --git a/conf/app.routes b/conf/app.routes index d00883c..b330fc2 100644 --- a/conf/app.routes +++ b/conf/app.routes @@ -3,8 +3,10 @@ -> /hmrc-frontend hmrcfrontend.Routes GET / uk.gov.hmrc.testuser.controllers.TestUserController.showCreateUserPage() +GET /ctc uk.gov.hmrc.testuser.controllers.TestUserController.showCreateUserPageCtc() POST /user uk.gov.hmrc.testuser.controllers.TestUserController.createUser() +POST /user/ctc uk.gov.hmrc.testuser.controllers.TestUserController.createUserCtc() # Map static resources from the /public folder to the /assets URL path GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/conf/application.conf b/conf/application.conf index 80b3106..a4598da 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -39,6 +39,8 @@ play.http.router=prod.Routes play.filters.enabled += play.filters.csp.CSPFilter play.filters.csp.directives.script-src = ${play.filters.csp.nonce.pattern} "'strict-dynamic' 'unsafe-inline' https: http:" +ctc-login-url = "http://localhost:9619/api-test-login/sign-in?continue=http://localhost:9485/manage-transit-movements" + play.i18n.langs = [ "en" ] tracking-consent-frontend { diff --git a/project/plugins.sbt b/project/plugins.sbt index 6171cf2..c97b089 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,7 +4,7 @@ resolvers += Resolver.url("HMRC-open-artefacts-ivy", url("https://open.artefacts addSbtPlugin("uk.gov.hmrc" % "sbt-auto-build" % "3.9.0") addSbtPlugin("uk.gov.hmrc" % "sbt-distributables" % "2.2.0") addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.19") -addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.5.1") +addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.11") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.9.3") addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") diff --git a/test/uk/gov/hmrc/testuser/controllers/TestUserControllerSpec.scala b/test/uk/gov/hmrc/testuser/controllers/TestUserControllerSpec.scala index ad76ffd..39c2916 100644 --- a/test/uk/gov/hmrc/testuser/controllers/TestUserControllerSpec.scala +++ b/test/uk/gov/hmrc/testuser/controllers/TestUserControllerSpec.scala @@ -31,6 +31,10 @@ import play.api.test.FakeRequest import play.api.test.Helpers._ import uk.gov.hmrc.http.UpstreamErrorResponse import uk.gov.hmrc.test.utils.AsyncHmrcSpec +import org.scalatestplus.play.guice.GuiceOneAppPerSuite +import akka.stream.Materializer +import org.jsoup.nodes.Document +import uk.gov.hmrc.testuser.views.html.{CreateTestUserView, CreateTestUserViewCtc, TestUserView, TestUserViewCtc} import uk.gov.hmrc.testuser.ApplicationLogger import uk.gov.hmrc.testuser.common.LogSuppressing @@ -66,7 +70,10 @@ class TestUserControllerSpec extends AsyncHmrcSpec with GuiceOneAppPerSuite with val mcc = app.injector.instanceOf[MessagesControllerComponents] val createTestUserView = app.injector.instanceOf[CreateTestUserView] + val createTestUserViewCtc = app.injector.instanceOf[CreateTestUserViewCtc] + val testUserView = app.injector.instanceOf[TestUserView] + val testUserViewCtc = app.injector.instanceOf[TestUserViewCtc] val mockTestUserService = mock[TestUserService] val mockNavigationService = mock[NavigationService] @@ -81,7 +88,9 @@ class TestUserControllerSpec extends AsyncHmrcSpec with GuiceOneAppPerSuite with mockApiPlatformTestUserConnector, mcc, createTestUserView, - testUserView + createTestUserViewCtc, + testUserView, + testUserViewCtc ) when(mockTestUserService.createUser(eqTo(INDIVIDUAL))(*)).thenReturn(successful(individual))