mirror of
https://github.com/balzack/databag.git
synced 2025-05-04 23:45:21 +00:00
extening contact test
This commit is contained in:
parent
dff34b6df6
commit
41f0963908
@ -41,18 +41,24 @@ export type CardEntity = {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let disconnected = false;
|
||||||
|
let disconnecting = false;
|
||||||
|
let connected = false;
|
||||||
|
let connecting = false;
|
||||||
|
let deleted = false;
|
||||||
|
|
||||||
const getCard = (id: string) => {
|
const getCard = (id: string) => {
|
||||||
return {
|
return {
|
||||||
id: 'C000' + id,
|
id: 'C000' + id,
|
||||||
revision: 1,
|
revision: 1 + (connected ? 1 : 0),
|
||||||
data: {
|
data: {
|
||||||
detailRevision: 1,
|
detailRevision: 1 + (connected ? 1 : 0),
|
||||||
profileRevision: 1,
|
profileRevision: 1,
|
||||||
notifiedProfile: 1,
|
notifiedProfile: 1,
|
||||||
notifiedrticle: 1,
|
notifiedrticle: 1,
|
||||||
notifiedChannel: 1,
|
notifiedChannel: 1,
|
||||||
cardDetail: {
|
cardDetail: {
|
||||||
status: 'connected',
|
status: connected ? 'connected' : 'confirmed',
|
||||||
statusUpdated: 1,
|
statusUpdated: 1,
|
||||||
token: 'T000' + id,
|
token: 'T000' + id,
|
||||||
notes: '',
|
notes: '',
|
||||||
@ -74,11 +80,10 @@ const getCard = (id: string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let deleted = false;
|
|
||||||
|
|
||||||
jest.mock('../src/net/fetchUtil', () => {
|
jest.mock('../src/net/fetchUtil', () => {
|
||||||
|
|
||||||
const fn = jest.fn().mockImplementation((url: string, options: { method: string, body: string }) => {
|
const fn = jest.fn().mockImplementation((url: string, options: { method: string, body: string }) => {
|
||||||
console.log(url, options);
|
console.log(url);
|
||||||
if (url === 'http://test_url/contact/cards?agent=test_token' && options.method === 'GET') {
|
if (url === 'http://test_url/contact/cards?agent=test_token' && options.method === 'GET') {
|
||||||
return Promise.resolve({ status: 200, json: () => [getCard('A')] });
|
return Promise.resolve({ status: 200, json: () => [getCard('A')] });
|
||||||
}
|
}
|
||||||
@ -86,18 +91,37 @@ jest.mock('../src/net/fetchUtil', () => {
|
|||||||
deleted = true;
|
deleted = true;
|
||||||
return Promise.resolve({ status: 200, json: () => {} });
|
return Promise.resolve({ status: 200, json: () => {} });
|
||||||
}
|
}
|
||||||
|
else if (url === 'https://URL_A/contact/closeMessage') {
|
||||||
|
disconnecting = true;
|
||||||
|
return Promise.resolve({ status: 200, json: () => {} });
|
||||||
|
}
|
||||||
|
else if (url === 'https://URL_A/contact/openMessage') {
|
||||||
|
connecting = true;
|
||||||
|
return Promise.resolve({ status: 200, json: () => ({ token: 't', status: 'connected', viewRevision: 1, channelRevision: 1, profileRevision: 1, articleRevision: 1 }) });
|
||||||
|
}
|
||||||
|
else if (url === 'http://test_url/contact/cards?agent=test_token&revision=8' && options.method === 'GET') {
|
||||||
|
return Promise.resolve({ status: 200, json: () => [{ id: 'C000A', revision: 2 }] });
|
||||||
|
}
|
||||||
|
else if (url === 'http://test_url/contact/cards/C000A/status?agent=test_token' && options.body === '"confirmed"') {
|
||||||
|
disconnected = true;
|
||||||
|
return Promise.resolve({ status: 200, json: () => {} });
|
||||||
|
}
|
||||||
|
else if (url === 'http://test_url/contact/cards/C000A/status?agent=test_token&token=t&viewRevision=1&articleRevision=1&channelRevision=1&profileRevision=1') {
|
||||||
|
if (options.body === '"connected"') {
|
||||||
|
connected = true;
|
||||||
|
}
|
||||||
|
return Promise.resolve({ status: 200, json: () => {} });
|
||||||
|
}
|
||||||
|
else if (url === 'http://test_url/contact/cards?agent=test_token&revision=11' && options.method === 'GET') {
|
||||||
|
return Promise.resolve({ status: 200, json: () => [getCard('A')] });
|
||||||
|
}
|
||||||
else if (url === 'http://test_url/contact/cards?agent=test_token&revision=1' && options.method === 'GET') {
|
else if (url === 'http://test_url/contact/cards?agent=test_token&revision=1' && options.method === 'GET') {
|
||||||
if (deleted) {
|
return Promise.resolve({ status: 200, json: () => [getCard('A'), getCard('B')] });
|
||||||
return Promise.resolve({ status: 200, json: () => [{ id: 'C000A', revision: 2 }] });
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Promise.resolve({ status: 200, json: () => [getCard('A'), getCard('B')] });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (url === 'http://test_url/account/listing') {
|
else if (url === 'http://test_url/account/listing') {
|
||||||
return Promise.resolve({ status: 200, json: () => JSON.parse('[{"guid": "dbc14d0237657b5e5a08b76355e883c762f1d8e7b1b9ff51d0b6ed9469e814e2", "handle": "test1234", "imageSet": false, "node": "balzack.coredb.org", "version": "0.1.0"}, {"guid": "5e0cec83c81786ba6b374cac38bb248349965ba2e5ba53b0d7bbe6b61a749832", "handle": "1234ttttrr", "imageSet": false, "node": "balzack.coredb.org", "version": "0.1.0"}, {"guid": "0035d6ffd34218a12b6f3c67ed2c20f4eee06dc36eed03715bbf46f04366511c", "handle": "123ttttrr", "imageSet": false, "node": "balzack.coredb.org", "version": "0.1.0"}]')});
|
return Promise.resolve({ status: 200, json: () => JSON.parse('[{"guid": "dbc14d0237657b5e5a08b76355e883c762f1d8e7b1b9ff51d0b6ed9469e814e2", "handle": "test1234", "imageSet": false, "node": "balzack.coredb.org", "version": "0.1.0"}, {"guid": "5e0cec83c81786ba6b374cac38bb248349965ba2e5ba53b0d7bbe6b61a749832", "handle": "1234ttttrr", "imageSet": false, "node": "balzack.coredb.org", "version": "0.1.0"}, {"guid": "0035d6ffd34218a12b6f3c67ed2c20f4eee06dc36eed03715bbf46f04366511c", "handle": "123ttttrr", "imageSet": false, "node": "balzack.coredb.org", "version": "0.1.0"}]')});
|
||||||
}
|
}
|
||||||
else if (url === 'http://test_url/account/listing/G0000003/message') {
|
else if (url === 'http://test_url/contact/cards/C000A/closeMessage?agent=test_token' || url === 'http://test_url/contact/cards/C000A/openMessage?agent=test_token' || url === 'http://test_url/account/listing/G0000003/message') {
|
||||||
return Promise.resolve({ status: 200, json: () => JSON.parse('{"keyType": "RSA2048", "message": "eyJndWlkIjoiMDAzNWQ2ZmZkMzQyMThhMTJiNmYzYzY3ZWQyYzIwZjRlZWUwNmRjMzZlZWQwMzcxNWJiZjQ2ZjA0MzY2NTExYyIsInRpbWVzdGFtcCI6MTcyOTkwMjg4NCwibWVzc2FnZVR5cGUiOiJpZGVudGl0eSIsInZhbHVlIjoie1wicmV2aXNpb25cIjoxLFwiaGFuZGxlXCI6XCIxMjN0dHR0cnJcIixcInZlcnNpb25cIjpcIjAuMS4wXCIsXCJub2RlXCI6XCJiYWx6YWNrLmNvcmVkYi5vcmdcIixcInNlYWxcIjpcIlwifSJ9", "publicKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcmI1Zjd4a0NmODhlazhhQ05paVgKWlpJOCt3dlArSzZBUG85OWZCM3hBWWRGVi84djZzSTdCY3lnWXYxVC9QbzI2UmpPdEZjcVRRV1ZZZlBiTlZxVgpQQ1VSblJwWkVnQWVjSGdqUmNzSjF3cWJZQWZRSDhhRGR4aGE4enRRcS9ZVlVzRCtkRU5IamNYV0NCSW04eDVzCjZ2NXo1aS9BeFRyR2I4YlgybDAydUxaNmVIYjNuOHhUQkRMa2VPUzJBaFZWWW0zSVc3bjhrQUJnT2dQY1Y1QS8Ka1B2LzFWbnJ4OTd6Q2VNaHdYd3Y0SEpxTldGR3dvaUlTNzJXU2hCcWk5N2ZSRHlOSVJ4SVJrMDFRdlJYL3hMcQpuM3R0WWN1cWdYN0NoUGhyRHpwRVlKOUZKT0ZaQSt1TVF2K1NmZVg4YlQzcGEzV2hXNFFHZ3BMNXhuM0NuMTlkCkYwVG1laWVLSTUyR0lPejRLV1R2alJDZHc2YW5vTGJNWW0xUzM4emhpbHZ4YWlZWTZ4WXVpNXJneWU2bzJlakgKZGphV0kzeTRaZVJ1UnUxTEgzd1U2UGhzbGhDZnJrU05FVFIzRkd2RWRKNzRzdVFEVmtnakF2R3BqaC9FUlkyUApZYmE1L254WlJVRGF4bjFjcURzOU0wUk5pMHp0R2d3dVJPSE1WeHFNMEFONko2TnJlL3F0dTFGbm5SMVllMmQ5CnRHVDVLSXRaZUN2dzY0Y3U2SFhMZWFzcXg3b2kwbU5BT0RoQWUrMzlXbFN1VEE1YWNyR3YydFpUSldPY0I5TmcKNlpGb2hzY3ErbHdVZHM3ek1lVkdXU1VQWmtnZUxrTk9rT0ZlWVNuVk4wc2RaVHFQMllTU0hDU0hxS0dtaHlhMQpXRlNPMTBxaTZjQWhheldraWMyR0Zwa0NBd0VBQVE9PQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCg==", "signature": "gj5NKLzgF5HHWthu47ofuEhkhpOiP4CJ5QNG65VmuqL05Mu7dUef5Nxp6BacCIJoDb3GdYbHI/UBj0Ns4gBsMihOkwIMCav/P0FdvLYZQrpaNf6t6PUI2c4xW/w3gZ/5IrJiUmWE+PKYTjMjUlroc1gHAXIyGG2vs152HT2uMjB/kGKMU1nxvjABAN+khhw7h0iW3EBKffKRTeAsRjUw6YIXwmeYEM7MP8zrISkKquIScf4yxDM2iZWC0DJOvGa4XANqkLKLPNL11u7hBXt2Ovj++U5eQsYSXcn1IDyhwlgRyRzuNEayZJnpbCCyXybEIaty+bf0wdq5nVWi1E4ju4wY+Z1pV5lsXtuKyxA/GY4Zk3QMTwx4dz2tWPDQYa35VUeyxhm5U5iMWdFG+nJuhPT0IhajLWrrTzQA5xXCzb5Da/ae0FrS3w3opATKNKxDpl0P5gjCQ1Xbku7VoUYaQQ6JaTdxNV/eKNCmcDcCDnZoEsE0Mp1hcqf8nT6YVvIVJG5luhv5TWEmTLBgZsWfUreaUkz/DJV+0fLwfL6oZuRkEx3aZnU1BfWtsS1ecgVJ93Q73sGohnUN9EaeR4ruviMrb4x1lS1IHGFuKooGqChukuTbKxlBkeqABiMsVkvme846cpFWijv/CnK6yoDhJA9lHaugjI+KgapYZUOwJOg=", "signatureType": "PKCS1v15"}') });
|
return Promise.resolve({ status: 200, json: () => JSON.parse('{"keyType": "RSA2048", "message": "eyJndWlkIjoiMDAzNWQ2ZmZkMzQyMThhMTJiNmYzYzY3ZWQyYzIwZjRlZWUwNmRjMzZlZWQwMzcxNWJiZjQ2ZjA0MzY2NTExYyIsInRpbWVzdGFtcCI6MTcyOTkwMjg4NCwibWVzc2FnZVR5cGUiOiJpZGVudGl0eSIsInZhbHVlIjoie1wicmV2aXNpb25cIjoxLFwiaGFuZGxlXCI6XCIxMjN0dHR0cnJcIixcInZlcnNpb25cIjpcIjAuMS4wXCIsXCJub2RlXCI6XCJiYWx6YWNrLmNvcmVkYi5vcmdcIixcInNlYWxcIjpcIlwifSJ9", "publicKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcmI1Zjd4a0NmODhlazhhQ05paVgKWlpJOCt3dlArSzZBUG85OWZCM3hBWWRGVi84djZzSTdCY3lnWXYxVC9QbzI2UmpPdEZjcVRRV1ZZZlBiTlZxVgpQQ1VSblJwWkVnQWVjSGdqUmNzSjF3cWJZQWZRSDhhRGR4aGE4enRRcS9ZVlVzRCtkRU5IamNYV0NCSW04eDVzCjZ2NXo1aS9BeFRyR2I4YlgybDAydUxaNmVIYjNuOHhUQkRMa2VPUzJBaFZWWW0zSVc3bjhrQUJnT2dQY1Y1QS8Ka1B2LzFWbnJ4OTd6Q2VNaHdYd3Y0SEpxTldGR3dvaUlTNzJXU2hCcWk5N2ZSRHlOSVJ4SVJrMDFRdlJYL3hMcQpuM3R0WWN1cWdYN0NoUGhyRHpwRVlKOUZKT0ZaQSt1TVF2K1NmZVg4YlQzcGEzV2hXNFFHZ3BMNXhuM0NuMTlkCkYwVG1laWVLSTUyR0lPejRLV1R2alJDZHc2YW5vTGJNWW0xUzM4emhpbHZ4YWlZWTZ4WXVpNXJneWU2bzJlakgKZGphV0kzeTRaZVJ1UnUxTEgzd1U2UGhzbGhDZnJrU05FVFIzRkd2RWRKNzRzdVFEVmtnakF2R3BqaC9FUlkyUApZYmE1L254WlJVRGF4bjFjcURzOU0wUk5pMHp0R2d3dVJPSE1WeHFNMEFONko2TnJlL3F0dTFGbm5SMVllMmQ5CnRHVDVLSXRaZUN2dzY0Y3U2SFhMZWFzcXg3b2kwbU5BT0RoQWUrMzlXbFN1VEE1YWNyR3YydFpUSldPY0I5TmcKNlpGb2hzY3ErbHdVZHM3ek1lVkdXU1VQWmtnZUxrTk9rT0ZlWVNuVk4wc2RaVHFQMllTU0hDU0hxS0dtaHlhMQpXRlNPMTBxaTZjQWhheldraWMyR0Zwa0NBd0VBQVE9PQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCg==", "signature": "gj5NKLzgF5HHWthu47ofuEhkhpOiP4CJ5QNG65VmuqL05Mu7dUef5Nxp6BacCIJoDb3GdYbHI/UBj0Ns4gBsMihOkwIMCav/P0FdvLYZQrpaNf6t6PUI2c4xW/w3gZ/5IrJiUmWE+PKYTjMjUlroc1gHAXIyGG2vs152HT2uMjB/kGKMU1nxvjABAN+khhw7h0iW3EBKffKRTeAsRjUw6YIXwmeYEM7MP8zrISkKquIScf4yxDM2iZWC0DJOvGa4XANqkLKLPNL11u7hBXt2Ovj++U5eQsYSXcn1IDyhwlgRyRzuNEayZJnpbCCyXybEIaty+bf0wdq5nVWi1E4ju4wY+Z1pV5lsXtuKyxA/GY4Zk3QMTwx4dz2tWPDQYa35VUeyxhm5U5iMWdFG+nJuhPT0IhajLWrrTzQA5xXCzb5Da/ae0FrS3w3opATKNKxDpl0P5gjCQ1Xbku7VoUYaQQ6JaTdxNV/eKNCmcDcCDnZoEsE0Mp1hcqf8nT6YVvIVJG5luhv5TWEmTLBgZsWfUreaUkz/DJV+0fLwfL6oZuRkEx3aZnU1BfWtsS1ecgVJ93Q73sGohnUN9EaeR4ruviMrb4x1lS1IHGFuKooGqChukuTbKxlBkeqABiMsVkvme846cpFWijv/CnK6yoDhJA9lHaugjI+KgapYZUOwJOg=", "signatureType": "PKCS1v15"}') });
|
||||||
}
|
}
|
||||||
else if (url === 'http://test_url/contact/cards?agent=test_token' && options.method === 'POST') {
|
else if (url === 'http://test_url/contact/cards?agent=test_token' && options.method === 'POST') {
|
||||||
@ -184,23 +208,34 @@ test('adds new contact', async () => {
|
|||||||
expect(added).toBe('eyJndWlkI');
|
expect(added).toBe('eyJndWlkI');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('connects with known contact', async () => {
|
test('removes contact', async () => {
|
||||||
const contact = new ContactModule(log, store, crypto, 'test_guid', 'test_token', 'test_url', false, [], []);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('disconnects with connected contact', async () => {
|
|
||||||
const contact = new ContactModule(log, store, crypto, 'test_guid', 'test_token', 'test_url', false, [], []);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('removes connected contact', async () => {
|
|
||||||
let testCards: Card[] = [];
|
let testCards: Card[] = [];
|
||||||
const update = (cards: Card[]) => { testCards = cards }
|
const update = (cards: Card[]) => { testCards = cards }
|
||||||
const contact = new ContactModule(log, store, crypto, 'test_guid', 'test_token', 'test_url', false, [], []);
|
const contact = new ContactModule(log, store, crypto, 'test_guid', 'test_token', 'test_url', false, [], []);
|
||||||
contact.addCardListener(update);
|
contact.addCardListener(update);
|
||||||
contact.setRevision(1)
|
contact.setRevision(8)
|
||||||
await waitFor(() => testCards.length === 1);
|
await waitFor(() => testCards.length === 1);
|
||||||
await contact.removeCard('C000A');
|
await contact.removeCard('C000A');
|
||||||
contact.setRevision(2)
|
contact.setRevision(9)
|
||||||
await waitFor(() => testCards.length === 0);
|
await waitFor(() => testCards.length === 0);
|
||||||
|
expect(deleted).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('connects and disconnects with known contact', async () => {
|
||||||
|
let testCards: Card[] = [];
|
||||||
|
const update = (cards: Card[]) => { testCards = cards }
|
||||||
|
const contact = new ContactModule(log, store, crypto, 'test_guid', 'test_token', 'test_url', false, [], []);
|
||||||
|
contact.addCardListener(update);
|
||||||
|
contact.setRevision(11)
|
||||||
|
await waitFor(() => testCards.length === 1);
|
||||||
|
await contact.connectCard('C000A');
|
||||||
|
await waitFor(() => connecting);
|
||||||
|
await waitFor(() => connected);
|
||||||
|
contact.setRevision(12)
|
||||||
|
await waitFor(() => (testCards[0]?.status === 'connected'));
|
||||||
|
await contact.disconnectCard('C000A');
|
||||||
|
await waitFor(() => disconnecting);
|
||||||
|
await waitFor(() => disconnected);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -674,8 +674,8 @@ export class ContactModule implements Contact {
|
|||||||
const insecure = /^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|:\d+$|$)){4}$/.test(server);
|
const insecure = /^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|:\d+$|$)){4}$/.test(server);
|
||||||
const contact = await setCardOpenMessage(server, !insecure, message);
|
const contact = await setCardOpenMessage(server, !insecure, message);
|
||||||
if (contact.status === 'connected') {
|
if (contact.status === 'connected') {
|
||||||
const { token, articleRevision, channelRevision, profileRevision } = contact;
|
const { token: contactToken, articleRevision, channelRevision, profileRevision } = contact;
|
||||||
await setCardConnected(node, secure, token, cardId, token, articleRevision, channelRevision, profileRevision);
|
await setCardConnected(node, secure, token, cardId, contactToken, articleRevision, channelRevision, profileRevision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -4,7 +4,7 @@ export async function setCardConnected(node: string, secure: boolean, token: str
|
|||||||
const endpoint = `http${secure ? "s" : ""}://${node}/contact/cards/${cardId}/status?agent=${token}&token=${access}&viewRevision=1&articleRevision=${article}&channelRevision=${channel}&profileRevision=${profile}`;
|
const endpoint = `http${secure ? "s" : ""}://${node}/contact/cards/${cardId}/status?agent=${token}&token=${access}&viewRevision=1&articleRevision=${article}&channelRevision=${channel}&profileRevision=${profile}`;
|
||||||
const { status } = await fetchWithTimeout(endpoint, {
|
const { status } = await fetchWithTimeout(endpoint, {
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
body: JSON.stringify("connecting"),
|
body: JSON.stringify("connected"),
|
||||||
});
|
});
|
||||||
checkResponse(status);
|
checkResponse(status);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user