Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 57 additions & 63 deletions test-e2e/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -507,74 +507,68 @@ test('connecting and then immediately disconnecting (and then immediately connec
)
})

test(
'duplicate add server from more than one device',
{ skip: USE_REMOTE_SERVER },
async (t) => {
const [managers, { serverBaseUrl }] = await Promise.all([
createManagers(2, t, 'mobile'),
createTestServer(t),
])
const [managerA, managerB] = managers

// Manager A: create project and add the server to it
const projectId = await managerA.createProject({ name: 'foo' })
const managerAProject = await managerA.getProject(projectId)
t.after(() => managerAProject.$sync.disconnectServers())

// Add Manager B to project
const disconnectManagers1 = connectPeers(managers)
await waitForPeers(managers)
await invite({
invitor: managerA,
invitees: [managerB],
projectId,
roleId: COORDINATOR_ROLE_ID,
})
const managerBProject = await managerB.getProject(projectId)
t.after(() => managerBProject.$sync.disconnectServers())
await disconnectManagers1()
test('duplicate add server from more than one device', async (t) => {
const [managers, { serverBaseUrl }] = await Promise.all([
createManagers(2, t, 'mobile'),
createTestServer(t),
])
const [managerA, managerB] = managers

// Both managers add the server at the same time
await Promise.all([
managerAProject.$member.addServerPeer(serverBaseUrl, {
dangerouslyAllowInsecureConnections: true,
}),
// Manager A: create project and add the server to it
const projectId = await managerA.createProject({ name: 'foo' })
const managerAProject = await managerA.getProject(projectId)
t.after(() => managerAProject.$sync.disconnectServers())

managerBProject.$member.addServerPeer(serverBaseUrl, {
dangerouslyAllowInsecureConnections: true,
}),
])
// Add Manager B to project
const disconnectManagers1 = connectPeers(managers)
await waitForPeers(managers)
await invite({
invitor: managerA,
invitees: [managerB],
projectId,
roleId: COORDINATOR_ROLE_ID,
})
const managerBProject = await managerB.getProject(projectId)
t.after(() => managerBProject.$sync.disconnectServers())
await disconnectManagers1()

// Sync managers so that duplicate server entries sync
const disconnectManagers2 = connectPeers(managers)
t.after(disconnectManagers2)
await waitForPeers(managers)
const projects = [managerAProject, managerBProject]
await waitForSync(projects, 'initial')

// manager A tries to remove server peer
const serverPeerA = await findServerPeer(managerAProject)
assert(serverPeerA, 'Manager A must have a server peer')
await managerAProject.$member.removeServerPeer(serverPeerA.deviceId, {
dangerouslyAllowInsecureConnections: true,
})
// Both managers add the same server without syncing with each other
await managerAProject.$member.addServerPeer(serverBaseUrl, {
dangerouslyAllowInsecureConnections: true,
})

// Sync managers so that removal syncs
await waitForSync(projects, 'initial')
await managerBProject.$member.addServerPeer(serverBaseUrl, {
dangerouslyAllowInsecureConnections: true,
})

const serverPeerInA = await findServerPeer(managerAProject)
assert(
serverPeerInA?.role.roleId === BLOCKED_ROLE_ID,
'server in A is blocked'
)
const serverPeerInB = await findServerPeer(managerBProject)
assert(
serverPeerInB?.role.roleId === BLOCKED_ROLE_ID,
'server in B is blocked'
)
}
)
// Sync managers so that duplicate server entries sync
const disconnectManagers2 = connectPeers(managers)
t.after(disconnectManagers2)
await waitForPeers(managers)
const projects = [managerAProject, managerBProject]
await waitForSync(projects, 'initial')

// manager A tries to remove server peer
const serverPeerA = await findServerPeer(managerAProject)
assert(serverPeerA, 'Manager A must have a server peer')
await managerAProject.$member.removeServerPeer(serverPeerA.deviceId, {
dangerouslyAllowInsecureConnections: true,
})

// Sync managers so that removal syncs
await waitForSync(projects, 'initial')

const serverPeerInA = await findServerPeer(managerAProject)
assert(
serverPeerInA?.role.roleId === BLOCKED_ROLE_ID,
'server in A is blocked'
)
const serverPeerInB = await findServerPeer(managerBProject)
assert(
serverPeerInB?.role.roleId === BLOCKED_ROLE_ID,
'server in B is blocked'
)
})

/**
* @typedef {object} LocalTestServer
Expand Down