#!/usr/bin/env python3 # Libervia: an XMPP client # Copyright (C) 2009-2023 Jérôme Poisson (goffi@goffi.org) # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from twisted.internet import defer from pytest_twisted import ensureDeferred as ed from unittest.mock import MagicMock from libervia.backend.plugins.plugin_xep_0215 import XEP_0215 from libervia.backend.tools import xml_tools from twisted.words.protocols.jabber import jid class TestXEP0215: def test_parse_services(self, host): """Services are parsed correctly""" xep_0215 = XEP_0215(host) services_elt = xml_tools.parse( """ https://test.example/some_extension some_value 0 value_1 value_2 " """ ) services = xep_0215.parse_services(services_elt) expected_services = [ { "host": "test.example", "type": "stun", "port": 1234, }, { "host": "example.org", "type": "turn", "port": 5678, "restricted": True, "extended": [ { "fields": [ { "name": "some_key", "type": "text-single", "value": "some_value", "values": ["some_value"], }, { "name": "some_bool", "type": "boolean", "value": "0", "values": ["0"], }, { "name": "multiple_values", "type": "list-multi", "value": "value_1", "values": ["value_1", "value_2"], }, ], "namespace": "https://test.example/some_extension", } ], }, ] assert services == expected_services @ed async def test_get_external_services(self, host, client): xep_0215 = XEP_0215(host) client._xep_0215_services = {} iq_result = MagicMock() iq_result.send.return_value = defer.succeed(iq_result) client.IQ.return_value = iq_result iq_result_elt = xml_tools.parse( """ """ ) iq_result.send.return_value = defer.succeed(iq_result_elt) services = await xep_0215.get_external_services(client) expected_services = [ { "host": "test.example", "type": "stun", "port": 1234, }, { "host": "example.org", "type": "turn", "port": 5678, "restricted": True, }, ] assert services == expected_services @ed async def test_request_credentials(self, host, client): xep_0215 = XEP_0215(host) iq_result = MagicMock() iq_result.send.return_value = defer.succeed(iq_result) client.IQ.return_value = iq_result iq_result_elt = xml_tools.parse( """ """ ) iq_result.send.return_value = defer.succeed(iq_result_elt) credentials = await xep_0215.request_credentials(client, "test.example", "stun") expected_credentials = [ { "host": "test.example", "type": "stun", "port": 1234, "username": "user1", "password": "pass1", "restricted": True, } ] assert credentials == expected_credentials def test_services_push(self, host, client): xep_0215 = XEP_0215(host) client._xep_0215_services = { jid.JID("test.example"): [ { "host": "test.example", "type": "stun", "port": 1234, }, { "host": "example.org", "type": "turn", "port": 5678, }, ], } iq_elt = xml_tools.parse( """ """ ) xep_0215.on_services_push(iq_elt, client) expected_services = [ { "host": "test.example", "type": "stun", "port": 1234, "expires": 1681130096.0, }, { "host": "example.net", "type": "stun", "port": 2345, }, ] assert client._xep_0215_services[jid.JID("test.example")] == expected_services