Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Fix and test matrix.to alias permalinks
Browse files Browse the repository at this point in the history
  • Loading branch information
turt2live committed Oct 27, 2018
1 parent 0bd1d6b commit 3bc5e2b
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 4 deletions.
17 changes: 14 additions & 3 deletions src/matrix-to.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,28 @@ 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) {
return `${baseUrl}/#/${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) {
Expand All @@ -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) {
Expand Down
120 changes: 119 additions & 1 deletion test/matrix-to-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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";


Expand Down Expand Up @@ -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");
});
});

0 comments on commit 3bc5e2b

Please sign in to comment.