Skip to content

Commit b130ec6

Browse files
pcapriottismatting
andauthored
Make sure integration tests use most recent API version (#2695)
* Avoid qualified Util import * Use viewGalley everywhere * Add v2 prefix to all galley requests * Add v2 prefix to all brig requests * client tests * account tests * auth tests wip * Fix one more client test * Add versioned paths to legalhold ACL * Refactor: factor out test cases * fix bug: regex routes match too much * Fix the remaining brig tests * Use versioned API in cargohold tests * Always use most recent version in galley tests * Use latest API version in brig * Use latest API version in cargohold * Use v1 API in End2End tests * Add CHANGELOG entry Co-authored-by: Stefan Matting <[email protected]>
1 parent 563d8e9 commit b130ec6

File tree

32 files changed

+673
-526
lines changed

32 files changed

+673
-526
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Make test API calls point to the most recent version by default

deploy/services-demo/conf/nginz/nginx.conf

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ http {
214214
proxy_pass http://brig;
215215
}
216216

217-
location ~* ^/teams/invitations/([^/]*)$ {
217+
location ~* ^(/v[0-9]+)?/teams/invitations/([^/]*)$ {
218218
include common_response_no_zauth.conf;
219219
proxy_pass http://brig;
220220
}
@@ -226,7 +226,7 @@ http {
226226

227227
## brig authenticated endpoints
228228

229-
location /self {
229+
location ~* ^(/v[0-9]+)?/self$ {
230230
include common_response_with_zauth.conf;
231231
proxy_pass http://brig;
232232
}
@@ -261,7 +261,7 @@ http {
261261
proxy_pass http://brig;
262262
}
263263

264-
location /clients {
264+
location ~* ^(/v[0-9]+)?/clients$ {
265265
include common_response_with_zauth.conf;
266266
proxy_pass http://brig;
267267
}
@@ -325,7 +325,7 @@ http {
325325
proxy_pass http://galley;
326326
}
327327

328-
location ~* /legalhold/conversations/(.*) {
328+
location ~* ^(/v[0-9]+)?/legalhold/conversations/(.*)$ {
329329
include common_response_with_zauth.conf;
330330
proxy_pass http://galley;
331331
}
@@ -454,7 +454,7 @@ http {
454454
proxy_pass http://gundeck;
455455
}
456456

457-
location /notifications {
457+
location ~* ^(/v[0-9]+)?/notifications$ {
458458
include common_response_with_zauth.conf;
459459
proxy_pass http://gundeck;
460460
}

libs/wire-api/src/Wire/API/Routes/Version.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ instance FromHttpApiData Version where
7373
parseHeader = first Text.pack . Aeson.eitherDecode . LBS.fromStrict
7474
parseUrlPiece = parseHeader . Text.encodeUtf8
7575

76+
instance ToHttpApiData Version where
77+
toHeader = LBS.toStrict . Aeson.encode
78+
toUrlPiece = Text.decodeUtf8 . toHeader
79+
7680
supportedVersions :: [Version]
7781
supportedVersions = [minBound .. maxBound]
7882

services/brig/test/integration/API/Internal.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ testAddKeyPackageRef brig = do
363363

364364
getFeatureConfig :: forall cfg m. (MonadIO m, MonadHttp m, HasCallStack, ApiFt.IsFeatureConfig cfg, KnownSymbol (ApiFt.FeatureSymbol cfg)) => (Request -> Request) -> UserId -> m ResponseLBS
365365
getFeatureConfig galley uid = do
366-
get $ galley . paths ["feature-configs", featureNameBS @cfg] . zUser uid
366+
get $ apiVersion "v1" . galley . paths ["feature-configs", featureNameBS @cfg] . zUser uid
367367

368368
getAllFeatureConfigs :: (MonadIO m, MonadHttp m, HasCallStack) => (Request -> Request) -> UserId -> m ResponseLBS
369369
getAllFeatureConfigs galley uid = do

services/brig/test/integration/API/Metrics.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ testPrometheusMetrics brig = do
5151
const (Just "TYPE http_request_duration_seconds histogram") =~= responseBody
5252

5353
testMetricsEndpoint :: Brig -> Http ()
54-
testMetricsEndpoint brig = do
55-
let p1 = "/self"
54+
testMetricsEndpoint brig0 = do
55+
let brig = apiVersion "v1" . brig0
56+
p1 = "/self"
5657
p2 uid = "/users/" <> uid <> "/clients"
5758
p3 = "/login"
5859
beforeSelf <- getCount "/self" "GET"
@@ -73,7 +74,7 @@ testMetricsEndpoint brig = do
7374
liftIO $ assertEqual "/login was called twice" (beforeProperties + 2) countProperties
7475
where
7576
getCount endpoint m = do
76-
rsp <- responseBody <$> get (brig . path "i/metrics")
77+
rsp <- responseBody <$> get (brig0 . path "i/metrics")
7778
-- is there some responseBodyAsText function used elsewhere?
7879
let asText = fromMaybe "" (fromByteString' (fromMaybe "" rsp))
7980
pure $ fromRight 0 (parseOnly (parseCount endpoint m) asText)

services/brig/test/integration/API/Settings.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ testUsersEmailVisibleIffExpected opts brig galley viewingUserIs visibilitySettin
125125
]
126126
let newOpts = opts & Opt.optionSettings . Opt.emailVisibility .~ visibilitySetting
127127
withSettingsOverrides newOpts $ do
128-
get (brig . zUser viewerId . path "users" . queryItem "ids" uids) !!! do
128+
get (apiVersion "v1" . brig . zUser viewerId . path "users" . queryItem "ids" uids) !!! do
129129
const 200 === statusCode
130130
const (Just expected) === result
131131
where
@@ -155,7 +155,7 @@ testGetUserEmailShowsEmailsIffExpected opts brig galley viewingUserIs visibility
155155
let newOpts = opts & Opt.optionSettings . Opt.emailVisibility .~ visibilitySetting
156156
withSettingsOverrides newOpts $ do
157157
forM_ expectations $ \(uid, expectedEmail) ->
158-
get (brig . zUser viewerId . paths ["users", toByteString' uid]) !!! do
158+
get (apiVersion "v1" . brig . zUser viewerId . paths ["users", toByteString' uid]) !!! do
159159
const 200 === statusCode
160160
const expectedEmail === emailResult
161161
where

services/brig/test/integration/API/Team.hs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ where
2424

2525
import qualified API.Search.Util as SearchUtil
2626
import API.Team.Util
27-
import API.User.Util as Util hiding (listConnections)
27+
import API.User.Util as Util
2828
import Bilge hiding (accept, head, timeout)
2929
import qualified Bilge
3030
import Bilge.Assert
@@ -218,9 +218,9 @@ testInvitationEmailLookupNginz brig nginz = do
218218
-- expect an invitation to be found querying with email after invite
219219
headInvitationByEmail nginz email 200
220220

221-
headInvitationByEmail :: Brig -> Email -> Int -> Http ()
222-
headInvitationByEmail brig email expectedCode =
223-
Bilge.head (brig . path "/teams/invitations/by-email" . contentJson . queryItem "email" (toByteString' email))
221+
headInvitationByEmail :: (Request -> Request) -> Email -> Int -> Http ()
222+
headInvitationByEmail service email expectedCode =
223+
Bilge.head (service . path "/teams/invitations/by-email" . contentJson . queryItem "email" (toByteString' email))
224224
!!! const expectedCode === statusCode
225225

226226
testInvitationTooManyPending :: Brig -> TeamSizeLimit -> Http ()
@@ -383,7 +383,9 @@ createAndVerifyInvitation' replacementBrigApp acceptFn invite brig galley = do
383383
mem <- getTeamMember invitee tid galley
384384
liftIO $ assertEqual "Member not part of the team" invitee (mem ^. Member.userId)
385385
liftIO $ assertEqual "Member has no/wrong invitation metadata" invmeta (mem ^. Member.invitation)
386-
conns <- listConnections invitee brig
386+
conns <-
387+
responseJsonError =<< listConnections brig invitee
388+
<!! const 200 === statusCode
387389
liftIO $ assertBool "User should have no connections" (null (clConnections conns) && not (clHasMore conns))
388390
pure (responseJsonMaybe rsp2, invitation)
389391

services/brig/test/integration/API/Team/Util.hs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import qualified Network.Wai.Utilities.Error as Error
3838
import Test.Tasty.HUnit
3939
import Util
4040
import Web.Cookie (parseSetCookie, setCookieName)
41-
import Wire.API.Connection
4241
import Wire.API.Conversation
4342
import Wire.API.Conversation.Protocol
4443
import Wire.API.Conversation.Role
@@ -343,15 +342,6 @@ register' e t c brig =
343342
)
344343
)
345344

346-
listConnections :: HasCallStack => UserId -> Brig -> (MonadIO m, MonadHttp m, MonadThrow m) => m UserConnectionList
347-
listConnections u brig = do
348-
responseJsonError
349-
=<< get
350-
( brig
351-
. path "connections"
352-
. zUser u
353-
)
354-
355345
getInvitation :: Brig -> InvitationCode -> (MonadIO m, MonadHttp m) => m (Maybe Invitation)
356346
getInvitation brig c = do
357347
r <-

services/brig/test/integration/API/User/Account.hs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ module API.User.Account
2424
where
2525

2626
import qualified API.Search.Util as Search
27-
import API.Team.Util hiding (listConnections)
27+
import API.Team.Util
2828
import API.User.Util
2929
import Bilge hiding (accept, timeout)
3030
import Bilge.Assert
@@ -589,11 +589,11 @@ testNonExistingUserUnqualified :: Brig -> Http ()
589589
testNonExistingUserUnqualified brig = do
590590
findingOne <- liftIO $ Id <$> UUID.nextRandom
591591
foundOne <- liftIO $ Id <$> UUID.nextRandom
592-
get (brig . paths ["users", pack $ show foundOne] . zUser findingOne)
592+
get (apiVersion "v1" . brig . paths ["users", pack $ show foundOne] . zUser findingOne)
593593
!!! do
594594
const 404 === statusCode
595595
const (Just "not-found") === fmap Error.label . responseJsonMaybe
596-
get (brig . paths ["users", pack $ show foundOne] . zUser foundOne)
596+
get (apiVersion "v1" . brig . paths ["users", pack $ show foundOne] . zUser foundOne)
597597
!!! do
598598
const 404 === statusCode
599599
const (Just "not-found") === fmap Error.label . responseJsonMaybe
@@ -605,11 +605,11 @@ testNonExistingUser brig = do
605605
uid2 <- liftIO $ Id <$> UUID.nextRandom
606606
let uid = qUnqualified qself
607607
domain = qDomain qself
608-
get (brig . paths ["users", toByteString' domain, toByteString' uid1] . zUser uid)
608+
get (apiVersion "v1" . brig . paths ["users", toByteString' domain, toByteString' uid1] . zUser uid)
609609
!!! do
610610
const 404 === statusCode
611611
const (Just "not-found") === fmap Error.label . responseJsonMaybe
612-
get (brig . paths ["users", toByteString' domain, toByteString' uid2] . zUser uid)
612+
get (apiVersion "v1" . brig . paths ["users", toByteString' domain, toByteString' uid2] . zUser uid)
613613
!!! do
614614
const 404 === statusCode
615615
const (Just "not-found") === fmap Error.label . responseJsonMaybe
@@ -629,7 +629,7 @@ testUserInvalidDomain brig = do
629629
testExistingUserUnqualified :: Brig -> Http ()
630630
testExistingUserUnqualified brig = do
631631
uid <- userId <$> randomUser brig
632-
get (brig . paths ["users", pack $ show uid] . zUser uid) !!! do
632+
get (apiVersion "v1" . brig . paths ["users", pack $ show uid] . zUser uid) !!! do
633633
const 200 === statusCode
634634
const (Just uid)
635635
=== ( \r -> do
@@ -643,7 +643,8 @@ testExistingUser brig = do
643643
let uid = qUnqualified quser
644644
domain = qDomain quser
645645
get
646-
( brig
646+
( apiVersion "v1"
647+
. brig
647648
. zUser uid
648649
. paths
649650
[ "users",
@@ -664,7 +665,8 @@ testUserExistsUnqualified brig = do
664665
qself <- userQualifiedId <$> randomUser brig
665666
quser <- userQualifiedId <$> randomUser brig
666667
head
667-
( brig
668+
( apiVersion "v1"
669+
. brig
668670
. paths ["users", toByteString' (qUnqualified quser)]
669671
. zUser (qUnqualified qself)
670672
)
@@ -726,7 +728,8 @@ testMultipleUsersUnqualified brig = do
726728
(Just $ userDisplayName u3, Nothing)
727729
]
728730
get
729-
( brig
731+
( apiVersion "v1"
732+
. brig
730733
. zUser (userId u1)
731734
. contentJson
732735
. path "users"
@@ -794,7 +797,7 @@ testCreateUserAnonExpiry b = do
794797
liftIO $ assertBool "Bob must be in deleted state" (fromMaybe False $ deleted resBob')
795798
where
796799
getProfile :: UserId -> UserId -> Http ResponseLBS
797-
getProfile zusr uid = get (b . zUser zusr . paths ["users", toByteString' uid]) <!! const 200 === statusCode
800+
getProfile zusr uid = get (apiVersion "v1" . b . zUser zusr . paths ["users", toByteString' uid]) <!! const 200 === statusCode
798801
awaitExpiry :: Int -> UserId -> UserId -> Http ()
799802
awaitExpiry n zusr uid = do
800803
-- after expiration, a profile lookup should trigger garbage collection of ephemeral users
@@ -818,7 +821,7 @@ testCreateUserAnonExpiry b = do
818821
field :: FromJSON a => Text -> Value -> Maybe a
819822
field f u = u ^? key f >>= maybeFromJSON
820823

821-
testUserUpdate :: Brig -> Cannon -> AWS.Env -> Http ()
824+
testUserUpdate :: HasCallStack => Brig -> Cannon -> AWS.Env -> Http ()
822825
testUserUpdate brig cannon aws = do
823826
aliceUser <- randomUser brig
824827
liftIO $ Util.assertUserJournalQueue "user create alice" aws (userActivateJournaled aliceUser)
@@ -1749,7 +1752,7 @@ execAndAssertUserDeletion brig cannon u hdl others aws execDelete = do
17491752
Search.refreshIndex brig
17501753
-- Does not appear in search; public profile shows the user as deleted
17511754
forM_ others $ \usr -> do
1752-
get (brig . paths ["users", toByteString' uid] . zUser usr) !!! assertDeletedProfilePublic
1755+
get (apiVersion "v1" . brig . paths ["users", toByteString' uid] . zUser usr) !!! assertDeletedProfilePublic
17531756
Search.assertCan'tFind brig usr quid (fromName (userDisplayName u))
17541757
Search.assertCan'tFind brig usr quid (fromHandle hdl)
17551758
-- Email address is available again

0 commit comments

Comments
 (0)