Skip to content

Commit 5b8f354

Browse files
committed
disco: make api.disco.entities.find return all matching entities and update tests accordingly
1 parent 81f7962 commit 5b8f354

File tree

2 files changed

+55
-30
lines changed

2 files changed

+55
-30
lines changed

src/headless/plugins/disco/api.js

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -205,26 +205,17 @@ export default {
205205
* @returns {Promise<DiscoEntity|null>} The matching DiscoEntity instance or null if not found.
206206
*/
207207
async find(feature) {
208-
const bare = _converse.session.get('bare_jid');
209-
const bare_entity = await api.disco.entities.get(bare);
210-
if (bare_entity && (await bare_entity.getFeature(feature))) {
211-
return bare_entity;
212-
}
213-
214-
const domain = Strophe.getDomainFromJid(bare);
215-
const domain_entity = await api.disco.entities.get(domain);
216-
if (domain_entity && (await domain_entity.getFeature(feature))) {
217-
return domain_entity;
218-
}
219-
220-
const items = await api.disco.entities.items(domain);
221-
for (const entity of items) {
222-
const jid = entity.get('jid');
223-
if (await api.disco.features.has(feature, jid)) {
224-
return api.disco.entities.get(jid);
225-
}
208+
await api.waitUntil('discoInitialized');
209+
const disco_entities = /** @type {DiscoEntities} */ (_converse.state.disco_entities);
210+
if (!disco_entities) {
211+
return [];
226212
}
227-
return null;
213+
const checks = disco_entities.map(async (entity) => {
214+
const has = await entity.getFeature(feature);
215+
return has ? entity : null;
216+
});
217+
const results = await Promise.all(checks);
218+
return results.filter((e) => e instanceof Object);
228219
},
229220

230221
/**

src/headless/plugins/disco/tests/disco.js

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,29 +119,35 @@ describe("Service Discovery", function () {
119119

120120
describe('api.disco.entities.find', function () {
121121
it(
122-
"returns our own JID's entity if the bare JID advertises the desired feature",
122+
"returns our own JID's entity",
123123
mock.initConverse([], {}, async function (_converse) {
124124
const bare = _converse.session.get('bare_jid');
125+
const domain = Strophe.getDomainFromJid(bare);
125126
await mock.waitUntilDiscoConfirmed(_converse, bare, [], ['feature1']);
126-
const result = await _converse.api.disco.entities.find('feature1');
127-
expect(result.get('jid')).toBe(bare);
127+
await mock.waitUntilDiscoConfirmed(_converse, domain, [], ['feature2']);
128+
const results = await _converse.api.disco.entities.find('feature1');
129+
expect(Array.isArray(results)).toBe(true);
130+
expect(results.length).toBe(1);
131+
expect(results[0].get('jid')).toBe(bare);
128132
})
129133
);
130134

131135
it(
132-
'returns the domain entity if bare JID does not advertise but domain does',
136+
'returns the domain entity',
133137
mock.initConverse([], {}, async function (_converse) {
134138
const bare = _converse.session.get('bare_jid');
135139
const domain = Strophe.getDomainFromJid(bare);
136140
await mock.waitUntilDiscoConfirmed(_converse, bare, [], []);
137141
await mock.waitUntilDiscoConfirmed(_converse, domain, [], ['feature2']);
138-
const result = await _converse.api.disco.entities.find('feature2');
139-
expect(result.get('jid')).toBe(domain);
142+
const results = await _converse.api.disco.entities.find('feature2');
143+
expect(Array.isArray(results)).toBe(true);
144+
expect(results.length).toBe(1);
145+
expect(results[0].get('jid')).toBe(domain);
140146
})
141147
);
142148

143149
it(
144-
'returns first matching item entity if neither bare nor domain advertises but an item does',
150+
'returns a matching item entity',
145151
mock.initConverse([], {}, async function (_converse) {
146152
const bare = _converse.session.get('bare_jid');
147153
const domain = Strophe.getDomainFromJid(bare);
@@ -155,8 +161,35 @@ describe("Service Discovery", function () {
155161
await mock.waitUntilDiscoConfirmed(_converse, domain, [], [], ['a@b', 'c@d'], 'items');
156162
await mock.waitUntilDiscoConfirmed(_converse, 'a@b', [], []);
157163
await mock.waitUntilDiscoConfirmed(_converse, 'c@d', [], ['feature3']);
158-
const result = await _converse.api.disco.entities.find('feature3');
159-
expect(result.get('jid')).toBe('c@d');
164+
const results = await _converse.api.disco.entities.find('feature3');
165+
expect(Array.isArray(results)).toBe(true);
166+
expect(results.length).toBe(1);
167+
expect(results[0].get('jid')).toBe('c@d');
168+
})
169+
);
170+
171+
it(
172+
'returns multiple matching entities',
173+
mock.initConverse([], {}, async function (_converse) {
174+
const bare = _converse.session.get('bare_jid');
175+
const domain = Strophe.getDomainFromJid(bare);
176+
await mock.waitUntilDiscoConfirmed(_converse, bare, [], ['feature']);
177+
await mock.waitUntilDiscoConfirmed(
178+
_converse,
179+
domain,
180+
[{ 'category': 'server', 'type': 'IM' }],
181+
['http://jabber.org/protocol/disco#items', 'feature']
182+
);
183+
await mock.waitUntilDiscoConfirmed(_converse, domain, [], [], ['a@b', 'c@d'], 'items');
184+
await mock.waitUntilDiscoConfirmed(_converse, 'a@b', [], ['feature']);
185+
await mock.waitUntilDiscoConfirmed(_converse, 'c@d', [], ['feature']);
186+
const results = await _converse.api.disco.entities.find('feature');
187+
expect(Array.isArray(results)).toBe(true);
188+
expect(results.length).toBe(4);
189+
expect(results[0].get('jid')).toBe(domain);
190+
expect(results[1].get('jid')).toBe(bare);
191+
expect(results[2].get('jid')).toBe('a@b');
192+
expect(results[3].get('jid')).toBe('c@d');
160193
})
161194
);
162195

@@ -173,8 +206,9 @@ describe("Service Discovery", function () {
173206
['http://jabber.org/protocol/disco#items']
174207
);
175208
await mock.waitUntilDiscoConfirmed(_converse, domain, [], [], [], 'items');
176-
const result = await _converse.api.disco.entities.find('feature4');
177-
expect(result).toBeNull();
209+
const results = await _converse.api.disco.entities.find('feature4');
210+
expect(Array.isArray(results)).toBe(true);
211+
expect(results.length).toBe(0);
178212
})
179213
);
180214
});

0 commit comments

Comments
 (0)