@@ -5,7 +5,7 @@ import code.api.Constant.SYSTEM_OWNER_VIEW_ID
55import code .api .ResponseHeader
66import code .api .util .APIUtil
77import code .api .util .ApiRole .{canCreateEntitlementAtAnyBank , canDeleteEntitlementAtAnyBank , canGetAnyUser , canGetCardsForBank , canGetCustomersAtOneBank , canReadResourceDoc }
8- import code .api .util .ErrorMessages .{AuthenticatedUserIsRequired , BankNotFound , UserHasMissingRoles }
8+ import code .api .util .ErrorMessages .{AuthenticatedUserIsRequired , BankNotFound , UserHasMissingRoles , UserNotFoundByUserId }
99import code .customer .CustomerX
1010import code .entitlement .Entitlement
1111import code .metadata .counterparties .Counterparties
@@ -1419,6 +1419,90 @@ class Http4s700RoutesTest extends ServerSetupWithTestData {
14191419 }
14201420 }
14211421
1422+ // ─── getUserByUserId ──────────────────────────────────────────────────────────
1423+
1424+ feature(" Http4s700 getUserByUserId endpoint" ) {
1425+
1426+ scenario(" Reject unauthenticated access to /users/user-id/USER_ID" , Http4s700RoutesTag ) {
1427+ Given (" GET /obp/v7.0.0/users/user-id/USER_ID with no auth headers" )
1428+ val (statusCode, json, _) = makeHttpRequest(s " /obp/v7.0.0/users/user-id/ ${resourceUser1.userId}" )
1429+
1430+ Then (" Response is 401 with AuthenticatedUserIsRequired message" )
1431+ statusCode shouldBe 401
1432+ json match {
1433+ case JObject (fields) =>
1434+ toFieldMap(fields).get(" message" ) match {
1435+ case Some (JString (msg)) => msg should include(AuthenticatedUserIsRequired )
1436+ case _ => fail(" Expected message field" )
1437+ }
1438+ case _ => fail(" Expected JSON object" )
1439+ }
1440+ }
1441+
1442+ scenario(" Return 403 when authenticated but missing canGetAnyUser role" , Http4s700RoutesTag ) {
1443+ Given (" GET /obp/v7.0.0/users/user-id/USER_ID with DirectLogin header but no role" )
1444+ val headers = Map (" DirectLogin" -> s " token= ${token1.value}" )
1445+ val (statusCode, json, _) = makeHttpRequest(s " /obp/v7.0.0/users/user-id/ ${resourceUser1.userId}" , headers)
1446+
1447+ Then (" Response is 403 with UserHasMissingRoles" )
1448+ statusCode shouldBe 403
1449+ json match {
1450+ case JObject (fields) =>
1451+ toFieldMap(fields).get(" message" ) match {
1452+ case Some (JString (msg)) =>
1453+ msg should include(UserHasMissingRoles )
1454+ msg should include(canGetAnyUser.toString)
1455+ case _ => fail(" Expected message field" )
1456+ }
1457+ case _ => fail(" Expected JSON object" )
1458+ }
1459+ }
1460+
1461+ scenario(" Return 200 with user fields when authenticated with canGetAnyUser role" , Http4s700RoutesTag ) {
1462+ Given (" canGetAnyUser role granted to resourceUser1" )
1463+ addEntitlement(" " , resourceUser1.userId, canGetAnyUser.toString)
1464+
1465+ When (s " GET /obp/v7.0.0/users/user-id/ ${resourceUser1.userId} with DirectLogin header " )
1466+ val headers = Map (" DirectLogin" -> s " token= ${token1.value}" )
1467+ val (statusCode, json, _) = makeHttpRequest(s " /obp/v7.0.0/users/user-id/ ${resourceUser1.userId}" , headers)
1468+
1469+ Then (" Response is 200 with user_id, username, email fields" )
1470+ statusCode shouldBe 200
1471+ json match {
1472+ case JObject (fields) =>
1473+ val m = toFieldMap(fields)
1474+ m.get(" user_id" ) match {
1475+ case Some (JString (id)) => id shouldBe resourceUser1.userId
1476+ case _ => fail(" Expected user_id field" )
1477+ }
1478+ m.keys should contain(" username" )
1479+ m.keys should contain(" email" )
1480+ m.keys should contain(" entitlements" )
1481+ case _ => fail(" Expected JSON object for getUserByUserId" )
1482+ }
1483+ }
1484+
1485+ scenario(" Return 404 when USER_ID does not exist" , Http4s700RoutesTag ) {
1486+ Given (" canGetAnyUser role granted to resourceUser1" )
1487+ addEntitlement(" " , resourceUser1.userId, canGetAnyUser.toString)
1488+
1489+ When (" GET /obp/v7.0.0/users/user-id/non-existing-user-id with DirectLogin header" )
1490+ val headers = Map (" DirectLogin" -> s " token= ${token1.value}" )
1491+ val (statusCode, json, _) = makeHttpRequest(" /obp/v7.0.0/users/user-id/non-existing-user-id-xyz" , headers)
1492+
1493+ Then (" Response is 404 with UserNotFoundByUserId message" )
1494+ statusCode shouldBe 404
1495+ json match {
1496+ case JObject (fields) =>
1497+ toFieldMap(fields).get(" message" ) match {
1498+ case Some (JString (msg)) => msg should include(UserNotFoundByUserId )
1499+ case _ => fail(" Expected message field" )
1500+ }
1501+ case _ => fail(" Expected JSON object" )
1502+ }
1503+ }
1504+ }
1505+
14221506 // ─── getCustomersAtOneBank ────────────────────────────────────────────────────
14231507
14241508 feature(" Http4s700 getCustomersAtOneBank endpoint" ) {
0 commit comments