Skip to content
Snippets Groups Projects
Commit 6c4d7425 authored by Vincent Texier's avatar Vincent Texier
Browse files

[enh] refactor request api.ws2p.heads in api.bma.network.ws2p_heads

Lock with a test
Remove obsolete ws2p folders
parent 877a4f52
No related branches found
No related tags found
1 merge request!65Pylint
......@@ -103,6 +103,37 @@ PEERS_SCHEMA = schema = {
]
}
WS2P_HEADS_SCHEMA = {
"type": "object",
"properties": {
"heads": {
"type": "array",
"items": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"sig": {
"type": "string",
},
"messageV2": {
"type": "string"
},
"sigV2": {
"type": "string",
},
"step": {
"type": "number",
},
},
"required": ["messageV2", "sigV2", "step"]
}
}
},
"required": ["heads"]
}
async def peering(client: Client) -> dict:
"""
......@@ -138,3 +169,13 @@ async def peer(client: Client, peer_signed_raw: str) -> ClientResponse:
:return:
"""
return await client.post(MODULE + '/peering/peers', {'peer': peer_signed_raw}, rtype=RESPONSE_AIOHTTP)
async def ws2p_heads(client: Client) -> dict:
"""
GET ws2p heads known by the node
:param client: Client to connect to the api
:rtype: dict
"""
return await client.get(MODULE + '/ws2p/heads', schema=WS2P_HEADS_SCHEMA)
from . import network
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Authors:
# Caner Candan <caner@candan.fr>, http://caner.candan.fr
# vit
import logging
from duniterpy.api.client import Client
logger = logging.getLogger("duniter/network")
MODULE = 'network'
WS2P_HEADS_SCHEMA = {
"type": "object",
"properties": {
"heads": {
"type": "array",
"items": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"sig": {
"type": "string",
},
"messageV2": {
"type": "string"
},
"sigV2": {
"type": "string",
},
"step": {
"type": "number",
},
},
"required": ["message", "sig"]
}
}
},
"required": ["heads"]
}
def heads(client: Client):
"""
GET Certification data over a member
:param client: Client to connect to the api
:rtype: dict
"""
return client.get(MODULE + '/ws2p/heads', schema=WS2P_HEADS_SCHEMA)
......@@ -77,3 +77,44 @@ class TestBmaNetwork(WebFunctionalSetupMixin, unittest.TestCase):
await client.close()
self.loop.run_until_complete(go())
def test_ws2p_heads(self):
json_sample = {
"heads": [
{
"messageV2": "WS2POCAIC:HEAD:2:238pNfpkNs4TdRgt6NnJ5Q72CDZbgNqm4cJo4nCP3BxC:367572"
"-000024399D612753E59D44415CFA61F3A663919110CD2EB8D30C93F49C61E07F:96675302:duniter"
":1.7.10:1:0:0",
"message": "WS2POCAIC:HEAD:1:238pNfpkNs4TdRgt6NnJ5Q72CDZbgNqm4cJo4nCP3BxC:367572"
"-000024399D612753E59D44415CFA61F3A663919110CD2EB8D30C93F49C61E07F:96675302:duniter:1"
".7.10:1",
"sigV2": "G1YQd5hgW6+bVGSZJgFzBjZyHgiIqzgUzHOVjcelbHJnwFtxl9XtqZiC5Ul0+Wv8im4IcOwgPypzFe/xUVJMBQ==",
"sig": "frlBj5ntC64H/iqNTqsB+igvEn2C9RD6fF2UOvZHWlzEqyaFy0YSRDyvZIyCTi/kPC+f1Xq2PKUItZvQdqPuAQ==",
"step": 0},
{
"messageV2": "WS2POTAIT:HEAD:2:CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7:378529"
"-00028D6F71E384565A1A106C1247E5F4B0392645A84EDB121173AC930540D552:3eaab4c7:duniter"
":1.7.18:1:30:30",
"message": "WS2POTAIT:HEAD:1:CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7:378529"
"-00028D6F71E384565A1A106C1247E5F4B0392645A84EDB121173AC930540D552:3eaab4c7:duniter:1"
".7.18:1",
"sigV2": "EIa5P8jJSdKR740/fLgu8u+7VFf6tiDs3xGKHxiM8nTVLjsZR8RoZtRGexqG0XIoPGpCty9rIduOu83knsorAA==",
"sig": "up5LLKm9DEXeiEAcMyPv9hignCx/rKlXSfcHVH1EZUOEMcNBiE4WzR4kSU8AA5cSpBYpZ7Uoo9y4ATmrLj3YDw==",
"step": 2}
]
}
jsonschema.validate(json_sample, network.WS2P_HEADS_SCHEMA)
def test_ws2p_heads_bad(self):
async def handler(request):
await request.read()
return web.Response(body=b'{}', content_type='application/json')
async def go():
_, port, url = await self.create_server('GET', '/network/ws2p/heads', handler)
with self.assertRaises(jsonschema.ValidationError):
client = Client(BMAEndpoint("127.0.0.1", "", "", port))
await client(network.ws2p_heads)
await client.close()
self.loop.run_until_complete(go())
import unittest
import jsonschema
from duniterpy.api.client import Client
from duniterpy.api.endpoint import BMAEndpoint
from duniterpy.api.ws2p.network import heads, WS2P_HEADS_SCHEMA
from tests.api.webserver import WebFunctionalSetupMixin, web
class TestWs2pHeads(WebFunctionalSetupMixin, unittest.TestCase):
def test_block(self):
json_sample = {
"heads": [
{
"message": "WS2POCAIC:HEAD:1:8iVdpXqFLCxGyPqgVx5YbFSkmWKkceXveRd2yvBKeARL:\
102102-000002C0694C7D373A78B095419C86584B81804CFB9641B7EBC3A18040B6FEE6:e66254bf:duniter:1.6.20:1",
"sig": "ZO5gSUMK6IaUEwU4K40nhuHOfnJ6Zfn8VS+4Ko2FM7t+mDsHf+3gDRT9PgV2p0fz81mF6jVYWpq2UYEsnK/gCg==",
"messageV2": "WS2POCAIC:HEAD:2:8iVdpXqFLCxGyPqgVx5YbFSkmWKkceXveRd2yvBKeARL:\
102102-000002C0694C7D373A78B095419C86584B81804CFB9641B7EBC3A18040B6FEE6:e66254bf:\
duniter:1.6.20:1:15:14",
"sigV2": "ReXzbgUya9jo4dL/R4g19Y+RE9BGB0xDkw7mrBWoldlRLkq3KFyRkAf9VthVx1UUb/AINr3nxImZKVQiVH9+DQ==",
"step": 0
},
{
"message": "WS2POCAIC:HEAD:1:2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ:\
102102-000002C0694C7D373A78B095419C86584B81804CFB9641B7EBC3A18040B6FEE6:a0a45ed2:duniter:1.6.21:1",
"sig": "pXLMmOpyEMdWihT183g/rnCvMzA2gHki5Cxg7rEl3psQu0RuK0ObCv5YFhmQnRlg+QZ1CWfbYEEbm3G1eGplAQ==",
"messageV2": "WS2POCAIC:HEAD:2:2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ:\
102102-000002C0694C7D373A78B095419C86584B81804CFB9641B7EBC3A18040B6FEE6:a0a45ed2:\
duniter:1.6.21:1:34:28",
"sigV2": "p5f7/KfQqjTaCYSMUXpjUDH7uF2DafetHNgphGzkOXgxM+Upeii0Fz2RFBwnZvN+Gjp81hAqSuH48PJP6HJSAw==",
"step": 1
},
{
"message": "WS2POCA:HEAD:1:GRBPV3Y7PQnB9LaZhSGuS3BqBJbSHyibzYq65kTh1nQ4:\
102102-000002C0694C7D373A78B095419C86584B81804CFB9641B7EBC3A18040B6FEE6:6d0e96f9:duniter:1.6.21:1",
"sig": "h9o1XBEV18gUzbvj1jdQB1M7U8ifZprIyVwLdlSQEfeG9WZLvZAjYzLGA2nD6h/9RkJLOJPzIQJXysHUHJ2dDQ==",
"messageV2": "WS2POCA:HEAD:2:GRBPV3Y7PQnB9LaZhSGuS3BqBJbSHyibzYq65kTh1nQ4:\
102102-000002C0694C7D373A78B095419C86584B81804CFB9641B7EBC3A18040B6FEE6:6d0e96f9:\
duniter:1.6.21:1:20:20",
"sigV2": "VsyQmXOUYrfHWy0FeS4rJrIJCUBI+3BergbSYQ78icJWV6MQzZSw7Z+Yl7urujCYZriDQM76D6GW+6F0EELpBQ==",
"step": 2
},
]
}
jsonschema.validate(json_sample, WS2P_HEADS_SCHEMA)
def test_ws2p_heads_bad(self):
async def handler(request):
await request.read()
return web.Response(body=b'{}', content_type='application/json')
async def go():
_, port, url = await self.create_server('GET', '/network/ws2p/heads', handler)
with self.assertRaises(jsonschema.ValidationError):
client = Client(BMAEndpoint("127.0.0.1", "", "", port))
await client(heads)
await client.close()
self.loop.run_until_complete(go())
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment