mirror of
https://github.com/element-hq/element-web
synced 2024-11-22 17:25:50 +03:00
Fix and test matrix.to alias permalinks
Fixes https://github.com/vector-im/riot-web/issues/7614 Regression of https://github.com/matrix-org/matrix-react-sdk/pull/2250
This commit is contained in:
parent
0bd1d6b778
commit
3bc5e2beb3
2 changed files with 133 additions and 4 deletions
|
@ -24,8 +24,13 @@ export const baseUrl = `https://${host}`;
|
|||
const MAX_SERVER_CANDIDATES = 3;
|
||||
|
||||
export function makeEventPermalink(roomId, eventId) {
|
||||
const permalinkBase = `${baseUrl}/#/${roomId}/${eventId}`;
|
||||
|
||||
// If the roomId isn't actually a room ID, don't try to list the servers.
|
||||
// Aliases are already routable, and don't need extra information.
|
||||
if (roomId[0] !== '!') return permalinkBase;
|
||||
const serverCandidates = pickServerCandidates(roomId);
|
||||
return `${baseUrl}/#/${roomId}/${eventId}?${encodeServerCandidates(serverCandidates)}`;
|
||||
return `${permalinkBase}${encodeServerCandidates(serverCandidates)}`;
|
||||
}
|
||||
|
||||
export function makeUserPermalink(userId) {
|
||||
|
@ -33,8 +38,14 @@ export function makeUserPermalink(userId) {
|
|||
}
|
||||
|
||||
export function makeRoomPermalink(roomId) {
|
||||
const permalinkBase = `${baseUrl}/#/${roomId}`;
|
||||
|
||||
// If the roomId isn't actually a room ID, don't try to list the servers.
|
||||
// Aliases are already routable, and don't need extra information.
|
||||
if (roomId[0] !== '!') return permalinkBase;
|
||||
|
||||
const serverCandidates = pickServerCandidates(roomId);
|
||||
return `${baseUrl}/#/${roomId}?${encodeServerCandidates(serverCandidates)}`;
|
||||
return `${permalinkBase}${encodeServerCandidates(serverCandidates)}`;
|
||||
}
|
||||
|
||||
export function makeGroupPermalink(groupId) {
|
||||
|
@ -43,7 +54,7 @@ export function makeGroupPermalink(groupId) {
|
|||
|
||||
export function encodeServerCandidates(candidates) {
|
||||
if (!candidates) return '';
|
||||
return `via=${candidates.map(c => encodeURIComponent(c)).join("&via=")}`;
|
||||
return `?via=${candidates.map(c => encodeURIComponent(c)).join("&via=")}`;
|
||||
}
|
||||
|
||||
export function pickServerCandidates(roomId) {
|
||||
|
|
|
@ -13,7 +13,13 @@ limitations under the License.
|
|||
|
||||
import expect from 'expect';
|
||||
import peg from '../src/MatrixClientPeg';
|
||||
import {pickServerCandidates} from "../src/matrix-to";
|
||||
import {
|
||||
makeEventPermalink,
|
||||
makeGroupPermalink,
|
||||
makeRoomPermalink,
|
||||
makeUserPermalink,
|
||||
pickServerCandidates
|
||||
} from "../src/matrix-to";
|
||||
import * as testUtils from "./test-utils";
|
||||
|
||||
|
||||
|
@ -228,4 +234,116 @@ describe('matrix-to', function() {
|
|||
expect(pickedServers.length).toBe(1);
|
||||
expect(pickedServers[0]).toBe("example.org:8448");
|
||||
});
|
||||
|
||||
it('should generate an event permalink for room IDs with no candidate servers', function() {
|
||||
peg.get().getRoom = () => null;
|
||||
const result = makeEventPermalink("!somewhere:example.org", "$something:example.com");
|
||||
expect(result).toBe("https://matrix.to/#/!somewhere:example.org/$something:example.com");
|
||||
});
|
||||
|
||||
it('should generate an event permalink for room IDs with some candidate servers', function() {
|
||||
peg.get().getRoom = () => {
|
||||
return {
|
||||
getJoinedMembers: () => [
|
||||
{
|
||||
userId: "@alice:first",
|
||||
powerLevel: 100,
|
||||
},
|
||||
{
|
||||
userId: "@bob:second",
|
||||
powerLevel: 0,
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
const result = makeEventPermalink("!somewhere:example.org", "$something:example.com");
|
||||
expect(result).toBe("https://matrix.to/#/!somewhere:example.org/$something:example.com?via=first&via=second");
|
||||
});
|
||||
|
||||
it('should generate a room permalink for room IDs with no candidate servers', function() {
|
||||
peg.get().getRoom = () => null;
|
||||
const result = makeRoomPermalink("!somewhere:example.org");
|
||||
expect(result).toBe("https://matrix.to/#/!somewhere:example.org");
|
||||
});
|
||||
|
||||
it('should generate a room permalink for room IDs with some candidate servers', function() {
|
||||
peg.get().getRoom = () => {
|
||||
return {
|
||||
getJoinedMembers: () => [
|
||||
{
|
||||
userId: "@alice:first",
|
||||
powerLevel: 100,
|
||||
},
|
||||
{
|
||||
userId: "@bob:second",
|
||||
powerLevel: 0,
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
const result = makeRoomPermalink("!somewhere:example.org");
|
||||
expect(result).toBe("https://matrix.to/#/!somewhere:example.org?via=first&via=second");
|
||||
});
|
||||
|
||||
// Technically disallowed but we'll test it anyways
|
||||
it('should generate an event permalink for room aliases with no candidate servers', function() {
|
||||
peg.get().getRoom = () => null;
|
||||
const result = makeEventPermalink("#somewhere:example.org", "$something:example.com");
|
||||
expect(result).toBe("https://matrix.to/#/#somewhere:example.org/$something:example.com");
|
||||
});
|
||||
|
||||
// Technically disallowed but we'll test it anyways
|
||||
it('should generate an event permalink for room aliases without candidate servers even when some are available', function() {
|
||||
peg.get().getRoom = () => {
|
||||
return {
|
||||
getJoinedMembers: () => [
|
||||
{
|
||||
userId: "@alice:first",
|
||||
powerLevel: 100,
|
||||
},
|
||||
{
|
||||
userId: "@bob:second",
|
||||
powerLevel: 0,
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
const result = makeEventPermalink("#somewhere:example.org", "$something:example.com");
|
||||
expect(result).toBe("https://matrix.to/#/#somewhere:example.org/$something:example.com");
|
||||
});
|
||||
|
||||
it('should generate a room permalink for room aliases with no candidate servers', function() {
|
||||
peg.get().getRoom = () => null;
|
||||
const result = makeRoomPermalink("#somewhere:example.org");
|
||||
expect(result).toBe("https://matrix.to/#/#somewhere:example.org");
|
||||
});
|
||||
|
||||
it('should generate a room permalink for room aliases without candidate servers even when some are available', function() {
|
||||
peg.get().getRoom = () => {
|
||||
return {
|
||||
getJoinedMembers: () => [
|
||||
{
|
||||
userId: "@alice:first",
|
||||
powerLevel: 100,
|
||||
},
|
||||
{
|
||||
userId: "@bob:second",
|
||||
powerLevel: 0,
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
const result = makeRoomPermalink("#somewhere:example.org");
|
||||
expect(result).toBe("https://matrix.to/#/#somewhere:example.org");
|
||||
});
|
||||
|
||||
it('should generate a user permalink', function() {
|
||||
const result = makeUserPermalink("@someone:example.org");
|
||||
expect(result).toBe("https://matrix.to/#/@someone:example.org");
|
||||
});
|
||||
|
||||
it('should generate a group permalink', function() {
|
||||
const result = makeGroupPermalink("+community:example.org");
|
||||
expect(result).toBe("https://matrix.to/#/+community:example.org");
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue