Skip to content

Commit

Permalink
Merge pull request Sage-Bionetworks#754 from nickgros/PORTALS-2940b
Browse files Browse the repository at this point in the history
  • Loading branch information
nickgros authored Feb 29, 2024
2 parents a597593 + d8f5497 commit c4827b7
Show file tree
Hide file tree
Showing 10 changed files with 342 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import { QueryWrapper } from '../../../index'
import { getHandlersForTableQuery } from '../../../mocks/msw/handlers/tableQueryHandlers'
import { mockTableEntity } from '../../../mocks/entity/mockTableEntity'
import { mockFileViewEntity } from '../../../mocks/entity/mockFileView'
import { MOCK_TEAM_ID, mockTeamUserGroup } from '../../../mocks/team/mockTeam'
import { MOCK_TEAM_ID, mockTeamData } from '../../../mocks/team/mockTeam'
import { uniqueId } from 'lodash-es'

const queryResultBundle: QueryResultBundle =
Expand Down Expand Up @@ -252,7 +252,7 @@ describe('SynapseTableCell tests', () => {
rowData: [MOCK_TEAM_ID.toString()],
})

await screen.findByText(mockTeamUserGroup.userGroupHeader.userName, {
await screen.findByText(mockTeamData.name, {
exact: false,
})
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { formatDate } from '../../utils/functions/DateFormatter'
import dayjs from 'dayjs'
import { Router } from 'react-router-dom'
import { createMemoryHistory } from 'history'
import { mockActTeam } from '../../mocks/team/mockTeam'

function renderComponent(props: AccessRequestSubmissionTableProps) {
const { wrapperFn } = createWrapperAndQueryClient()
Expand Down Expand Up @@ -165,7 +166,7 @@ describe('Access Request Submission Table tests', () => {
})
await screen.findAllByText('@' + MOCK_USER_NAME_2)
await screen.findByRole('cell', {
name: 'Synapse Access and Compliance Team',
name: mockActTeam.name,
})
await screen.findByRole('cell', {
name: formatDate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import {
} from '../../mocks/user/mock_user_profile'
import * as RejectDataAccessRequestModalModule from './RejectDataAccessRequestModal'
import failOnConsoleError from 'jest-fail-on-console'
import { mockActTeam } from '../../mocks/team/mockTeam'

function renderComponent(props: SubmissionPageProps) {
render(<SubmissionPage {...props} />, {
Expand Down Expand Up @@ -164,7 +165,7 @@ describe('Submission Page tests', () => {
await screen.findByRole('button', { name: 'Reject' })

await screen.findByText('Assigned Reviewer')
await screen.findByText('Synapse Access and Compliance Team')
await screen.findByText(mockActTeam.name)

await screen.findByText('Conditions')
await screen.findByText('Expiration period: 1 day(s)')
Expand Down Expand Up @@ -325,9 +326,7 @@ describe('Submission Page tests', () => {
})

// When an ACL exists, don't show the ACT as the reviewer
expect(
screen.queryByText('Synapse Access and Compliance Team'),
).not.toBeInTheDocument()
expect(screen.queryByText(mockActTeam.name)).not.toBeInTheDocument()

// User 1 now appears as the submitter, modifier, an accessor, and the Reviewer
await waitFor(() =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
MOCK_TEAM_ID_2,
MOCK_TEAM_ID_3,
MOCK_TEAM_ID_4,
MOCK_TEAM_ID_5,
} from '../../team/mockTeam'
import { uniqueId } from 'lodash-es'

Expand All @@ -32,6 +33,10 @@ const registeredChallengeTeams = [
teamId: String(MOCK_TEAM_ID_4),
challengeId: MOCK_CHALLENGE_ID,
}),
mockChallengeTeam({
teamId: String(MOCK_TEAM_ID_5),
challengeId: MOCK_CHALLENGE_ID,
}),
]

export function getChallengeHandler(backendOrigin: string) {
Expand Down
153 changes: 151 additions & 2 deletions packages/synapse-react-client/src/mocks/msw/handlers/teamHandlers.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,24 @@
import { Team, TeamMembershipStatus } from '@sage-bionetworks/synapse-types'
import {
CreateMembershipInvitationRequest,
CreateMembershipRequestRequest,
CreateTeamRequest,
ListWrapper,
MembershipInvitation,
MembershipRequest,
PaginatedResults,
Team,
TeamMembershipStatus,
} from '@sage-bionetworks/synapse-types'
import { SynapseApiResponse } from '../handlers'
import { rest } from 'msw'
import { mockTeamMembershipStatuses, mockTeams } from '../../team/mockTeam'
import {
mockTeamMembershipInvitations,
mockTeamMembershipStatuses,
mockTeams,
} from '../../team/mockTeam'
import { MOCK_USER_ID } from '../../user/mock_user_profile'
import { uniqueId } from 'lodash-es'
import { delay } from '../../../synapse-client/HttpClient'

const teams: Team[] = [...mockTeams]

Expand All @@ -24,6 +41,76 @@ function addTeamMembershipStatus(teamMembershipStatus: TeamMembershipStatus) {
teamMemberships.push(teamMembershipStatus)
}

const teamMembershipInvitations: MembershipInvitation[] = [
...mockTeamMembershipInvitations,
]

export function getTeamHandler(backendOrigin: string) {
return rest.get(
`${backendOrigin}/repo/v1/team/:teamId`,
async (req, res, ctx) => {
const team = getMockTeamById(req.params.teamId as string)

return res(ctx.status(200), ctx.json(team))
},
)
}

export function getTeamListHandler(backendOrigin: string) {
return rest.post(
`${backendOrigin}/repo/v1/teamList`,
async (req, res, ctx) => {
const requestBody: { list: number[] } = await req.json()

const teams = requestBody.list
.map(teamId => {
return getMockTeamById(String(teamId))
})
.filter((team): team is Team => !!team)

const response: SynapseApiResponse<ListWrapper<Team>> = {
concreteType: 'org.sagebionetworks.repo.model.Team',
list: teams,
}

return res(ctx.status(200), ctx.json(response))
},
)
}

export function getCreateTeamHandler(backendOrigin: string) {
return rest.post(`${backendOrigin}/repo/v1/team`, async (req, res, ctx) => {
const requestBody: CreateTeamRequest = await req.json()
const team: Team = {
...requestBody,
createdBy: String(MOCK_USER_ID),
createdOn: new Date().toISOString(),
etag: 'etag',
id: uniqueId(),
modifiedBy: String(MOCK_USER_ID),
modifiedOn: new Date().toISOString(),
}

teams.push(team)
teamMemberships.push({
teamId: team.id,
userId: String(MOCK_USER_ID),
isMember: true,
hasOpenInvitation: false,
hasOpenRequest: false,
canJoin: false,
membershipApprovalRequired: false,
hasUnmetAccessRequirement: false,
canSendEmail: true,
})

// Avoid a race condition where the data in the arrays may not have updated before subsequent calls are made by the client
await delay(250)

return res(ctx.status(201), ctx.json(getMockTeamById(team.id)))
})
}

export function getTeamMembershipStatusHandler(backendOrigin: string) {
return rest.get(
`${backendOrigin}/repo/v1/team/:teamId/member/:memberId/membershipStatus`,
Expand Down Expand Up @@ -97,9 +184,71 @@ export function getUpdateTeamMembershipStatusHandler(backendOrigin: string) {
)
}

export function getCreateTeamMembershipRequestHandler(backendOrigin: string) {
return rest.post(
`${backendOrigin}/repo/v1/membershipRequest`,
async (req, res, ctx) => {
const requestBody: CreateMembershipRequestRequest = await req.json()

const response: SynapseApiResponse<MembershipRequest> = {
...requestBody,
id: uniqueId(),
createdOn: new Date().toISOString(),
createdBy: String(MOCK_USER_ID),
}
return res(ctx.status(201), ctx.json(response))
},
)
}

export function getCreateTeamMembershipInvitationHandler(
backendOrigin: string,
) {
return rest.post(
`${backendOrigin}/repo/v1/membershipInvitation`,
async (req, res, ctx) => {
const requestBody: CreateMembershipInvitationRequest = await req.json()

const response: SynapseApiResponse<MembershipInvitation> = {
...requestBody,
id: uniqueId(),
createdOn: new Date().toISOString(),
createdBy: String(MOCK_USER_ID),
}

teamMembershipInvitations.push(response)
return res(ctx.status(201), ctx.json(response))
},
)
}

export function getOpenInvitationsRequestHandler(backendOrigin: string) {
return rest.get(
`${backendOrigin}/repo/v1/user/:userId/openInvitation`,
async (req, res, ctx) => {
const userInvitations = teamMembershipInvitations.filter(inv => {
return String(inv.inviteeId) === String(req.params.userId)
})
const response: SynapseApiResponse<
PaginatedResults<MembershipInvitation>
> = {
results: userInvitations,
totalNumberOfResults: userInvitations.length,
}
return res(ctx.status(200), ctx.json(response))
},
)
}

export default function getAllTeamHandlers(backendOrigin: string) {
return [
getTeamHandler(backendOrigin),
getTeamListHandler(backendOrigin),
getCreateTeamHandler(backendOrigin),
getTeamMembershipStatusHandler(backendOrigin),
getUpdateTeamMembershipStatusHandler(backendOrigin),
getCreateTeamMembershipRequestHandler(backendOrigin),
getCreateTeamMembershipInvitationHandler(backendOrigin),
getOpenInvitationsRequestHandler(backendOrigin),
]
}
92 changes: 70 additions & 22 deletions packages/synapse-react-client/src/mocks/team/mockTeam.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
import { Team, TeamMembershipStatus } from '@sage-bionetworks/synapse-types'
import {
MembershipInvitation,
Team,
TeamMembershipStatus,
} from '@sage-bionetworks/synapse-types'
import {
MOCK_USER_ID,
MOCK_USER_ID_2,
MockUserOrTeamData,
} from '../user/mock_user_profile'
import { ACT_TEAM_ID } from '../../utils/SynapseConstants'
import { uniqueId } from 'lodash-es'

export const MOCK_TEAM_ID = 987654
export const MOCK_TEAM_ID_2 = 987655
export const MOCK_TEAM_ID_3 = 987656
export const MOCK_TEAM_ID_4 = 987657
export const MOCK_CHALLENGE_PARTICIPANT_TEAM_ID = 987658
export const MOCK_TEAM_ID_5 = 987658
export const MOCK_CHALLENGE_PARTICIPANT_TEAM_ID = 987659

export const mockTeamData: Readonly<Team> = {
id: String(MOCK_TEAM_ID),
Expand Down Expand Up @@ -68,6 +74,20 @@ export const mockTeamData4: Readonly<Team> = {
modifiedBy: String(MOCK_USER_ID_2),
}

export const mockTeamData5: Readonly<Team> = {
id: String(MOCK_TEAM_ID_5),
name: 'Mock team with open request',
description: 'A team that fake users have already requested to join',
icon: '',
canPublicJoin: false,
canRequestMembership: true,
etag: 'f29b79d6-5b63-4641-93c7-30d954b4328c',
createdOn: '2013-11-02T01:01:18.373Z',
modifiedOn: '2019-01-31T20:34:40.057Z',
createdBy: String(MOCK_USER_ID),
modifiedBy: String(MOCK_USER_ID_2),
}

export const mockChallengeParticipantTeamData: Readonly<Team> = {
id: String(MOCK_CHALLENGE_PARTICIPANT_TEAM_ID),
name: 'Mock team with open invitation',
Expand All @@ -81,36 +101,40 @@ export const mockChallengeParticipantTeamData: Readonly<Team> = {
modifiedBy: String(MOCK_USER_ID_2),
}

export const mockTeamUserGroup: MockUserOrTeamData = {
id: MOCK_TEAM_ID,
userProfile: null,
userBundle: null,
userGroupHeader: {
ownerId: MOCK_TEAM_ID.toString(),
userName: mockTeamData.name,
isIndividual: false,
},
}

export const mockActData: MockUserOrTeamData = {
id: ACT_TEAM_ID,
userProfile: null,
userBundle: null,
userGroupHeader: {
ownerId: ACT_TEAM_ID.toString(),
userName: 'Synapse Access and Compliance Team',
isIndividual: false,
},
export const mockActTeam: Readonly<Team> = {
id: String(ACT_TEAM_ID),
name: 'Mock Synapse ACT',
description: 'Same hard-coded ID as the ACT, but this is a mocked version',
icon: '',
canPublicJoin: false,
etag: 'f29b79d6-5b63-4641-93c7-30d954b4328c',
createdOn: '2013-11-02T01:01:18.373Z',
modifiedOn: '2019-01-31T20:34:40.057Z',
createdBy: String(MOCK_USER_ID),
modifiedBy: String(MOCK_USER_ID_2),
}

export const mockTeams: readonly Readonly<Team>[] = [
mockTeamData,
mockTeamData2,
mockTeamData3,
mockTeamData4,
mockTeamData5,
mockChallengeParticipantTeamData,
mockActTeam,
]

export const mockTeamUserGroups: MockUserOrTeamData[] = mockTeams.map(team => ({
id: parseInt(team.id),
userProfile: null,
userBundle: null,
userGroupHeader: {
ownerId: String(team.id),
userName: team.name,
isIndividual: false,
},
}))

export const mockTeamMembershipStatuses: readonly Readonly<TeamMembershipStatus>[] =
[
{
Expand Down Expand Up @@ -157,4 +181,28 @@ export const mockTeamMembershipStatuses: readonly Readonly<TeamMembershipStatus>
hasUnmetAccessRequirement: false,
canSendEmail: false,
},
{
teamId: mockTeamData5.id,
userId: String(MOCK_USER_ID),
isMember: false,
hasOpenInvitation: false,
hasOpenRequest: true,
canJoin: false,
membershipApprovalRequired: true,
hasUnmetAccessRequirement: false,
canSendEmail: false,
},
]

export const mockTeamMembershipInvitations: readonly Readonly<MembershipInvitation>[] =
[
{
id: uniqueId(),
createdOn: new Date().toISOString(),
createdBy: String(MOCK_USER_ID_2),
teamId: mockTeamData4.id,
inviteeId: String(MOCK_USER_ID),
message:
'Come join my cool team so we can submit to the challenge together!',
},
]
Loading

0 comments on commit c4827b7

Please sign in to comment.