mirror of
https://github.com/GNS3/gns3-server.git
synced 2025-06-21 16:39:40 +00:00
Refactor tests
* Use pytest-aiohttp * Use the async def / await syntax. * Fix tests to run with Python 3.8
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2015 GNS3 Technologies Inc.
|
||||
# Copyright (C) 2020 GNS3 Technologies Inc.
|
||||
#
|
||||
# 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
|
||||
@ -15,70 +15,50 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""
|
||||
This test suite check /project endpoint
|
||||
"""
|
||||
|
||||
import uuid
|
||||
import os
|
||||
import asyncio
|
||||
import aiohttp
|
||||
import pytest
|
||||
|
||||
from unittest.mock import MagicMock
|
||||
from tests.utils import AsyncioMagicMock
|
||||
|
||||
from unittest.mock import patch, MagicMock
|
||||
from tests.utils import asyncio_patch, AsyncioMagicMock
|
||||
|
||||
from gns3server.handlers.api.controller.project_handler import ProjectHandler
|
||||
from gns3server.controller import Controller
|
||||
from gns3server.controller.node import Node
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def compute(http_controller, async_run):
|
||||
compute = MagicMock()
|
||||
compute.id = "example.com"
|
||||
compute.host = "example.org"
|
||||
Controller.instance()._computes = {"example.com": compute}
|
||||
return compute
|
||||
def node(project, compute):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def project(http_controller, async_run):
|
||||
return async_run(Controller.instance().add_project(name="Test"))
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def node(project, compute, async_run):
|
||||
node = Node(project, compute, "test", node_type="vpcs")
|
||||
project._nodes[node.id] = node
|
||||
return node
|
||||
|
||||
|
||||
def test_create_node(http_controller, tmpdir, project, compute):
|
||||
async def test_create_node(controller_api, project, compute):
|
||||
|
||||
response = MagicMock()
|
||||
response.json = {"console": 2048}
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes".format(project.id), {
|
||||
response = await controller_api.post("/projects/{}/nodes".format(project.id), {
|
||||
"name": "test",
|
||||
"node_type": "vpcs",
|
||||
"compute_id": "example.com",
|
||||
"properties": {
|
||||
"startup_script": "echo test"
|
||||
}
|
||||
}, example=True)
|
||||
})
|
||||
|
||||
assert response.status == 201
|
||||
assert response.json["name"] == "test"
|
||||
assert "name" not in response.json["properties"]
|
||||
|
||||
|
||||
def test_list_node(http_controller, tmpdir, project, compute):
|
||||
async def test_list_node(controller_api, project, compute):
|
||||
|
||||
response = MagicMock()
|
||||
response.json = {"console": 2048}
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes".format(project.id), {
|
||||
await controller_api.post("/projects/{}/nodes".format(project.id), {
|
||||
"name": "test",
|
||||
"node_type": "vpcs",
|
||||
"compute_id": "example.com",
|
||||
@ -86,17 +66,19 @@ def test_list_node(http_controller, tmpdir, project, compute):
|
||||
"startup_script": "echo test"
|
||||
}
|
||||
})
|
||||
response = http_controller.get("/projects/{}/nodes".format(project.id), example=True)
|
||||
|
||||
response = await controller_api.get("/projects/{}/nodes".format(project.id))
|
||||
assert response.status == 200
|
||||
assert response.json[0]["name"] == "test"
|
||||
|
||||
|
||||
def test_get_node(http_controller, tmpdir, project, compute):
|
||||
async def test_get_node(controller_api, project, compute):
|
||||
|
||||
response = MagicMock()
|
||||
response.json = {"console": 2048}
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes".format(project.id), {
|
||||
response = await controller_api.post("/projects/{}/nodes".format(project.id), {
|
||||
"name": "test",
|
||||
"node_type": "vpcs",
|
||||
"compute_id": "example.com",
|
||||
@ -104,174 +86,175 @@ def test_get_node(http_controller, tmpdir, project, compute):
|
||||
"startup_script": "echo test"
|
||||
}
|
||||
})
|
||||
response = http_controller.get("/projects/{}/nodes/{}".format(project.id, response.json["node_id"]), example=True)
|
||||
|
||||
response = await controller_api.get("/projects/{}/nodes/{}".format(project.id, response.json["node_id"]))
|
||||
assert response.status == 200
|
||||
assert response.json["name"] == "test"
|
||||
|
||||
|
||||
def test_update_node(http_controller, tmpdir, project, compute, node):
|
||||
async def test_update_node(controller_api, project, compute, node):
|
||||
|
||||
response = MagicMock()
|
||||
response.json = {"console": 2048}
|
||||
compute.put = AsyncioMagicMock(return_value=response)
|
||||
|
||||
response = http_controller.put("/projects/{}/nodes/{}".format(project.id, node.id), {
|
||||
response = await controller_api.put("/projects/{}/nodes/{}".format(project.id, node.id), {
|
||||
"name": "test",
|
||||
"node_type": "vpcs",
|
||||
"compute_id": "example.com",
|
||||
"properties": {
|
||||
"startup_script": "echo test"
|
||||
}
|
||||
}, example=True)
|
||||
})
|
||||
|
||||
assert response.status == 200
|
||||
assert response.json["name"] == "test"
|
||||
assert "name" not in response.json["properties"]
|
||||
|
||||
|
||||
def test_start_all_nodes(http_controller, tmpdir, project, compute):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_start_all_nodes(controller_api, project, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/start".format(project.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/start".format(project.id))
|
||||
assert response.status == 204
|
||||
|
||||
|
||||
def test_stop_all_nodes(http_controller, tmpdir, project, compute):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_stop_all_nodes(controller_api, project, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/stop".format(project.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/stop".format(project.id))
|
||||
assert response.status == 204
|
||||
|
||||
|
||||
def test_suspend_all_nodes(http_controller, tmpdir, project, compute):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_suspend_all_nodes(controller_api, project, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/suspend".format(project.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/suspend".format(project.id))
|
||||
assert response.status == 204
|
||||
|
||||
|
||||
def test_reload_all_nodes(http_controller, tmpdir, project, compute):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_reload_all_nodes(controller_api, project, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/reload".format(project.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/reload".format(project.id))
|
||||
assert response.status == 204
|
||||
|
||||
|
||||
def test_start_node(http_controller, tmpdir, project, compute, node):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_start_node(controller_api, project, node, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/{}/start".format(project.id, node.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/{}/start".format(project.id, node.id))
|
||||
assert response.status == 200
|
||||
assert response.json == node.__json__()
|
||||
|
||||
|
||||
def test_stop_node(http_controller, tmpdir, project, compute, node):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_stop_node(controller_api, project, node, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/{}/stop".format(project.id, node.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/{}/stop".format(project.id, node.id))
|
||||
assert response.status == 200
|
||||
assert response.json == node.__json__()
|
||||
|
||||
|
||||
def test_suspend_node(http_controller, tmpdir, project, compute, node):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_suspend_node(controller_api, project, node, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/{}/suspend".format(project.id, node.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/{}/suspend".format(project.id, node.id))
|
||||
assert response.status == 200
|
||||
assert response.json == node.__json__()
|
||||
|
||||
|
||||
def test_reload_node(http_controller, tmpdir, project, compute, node):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_reload_node(controller_api, project, node, compute):
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/{}/reload".format(project.id, node.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/{}/reload".format(project.id, node.id))
|
||||
assert response.status == 200
|
||||
assert response.json == node.__json__()
|
||||
|
||||
|
||||
def test_duplicate_node(http_controller, tmpdir, project, compute, node):
|
||||
async def test_duplicate_node(controller_api, project, compute, node):
|
||||
|
||||
response = MagicMock()
|
||||
response.json({"console": 2035})
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
response = http_controller.post("/projects/{}/nodes/{}/duplicate".format(
|
||||
project.id, node.id),
|
||||
{"x": 10, "y": 5, "z": 0},
|
||||
example=True)
|
||||
response = await controller_api.post("/projects/{}/nodes/{}/duplicate".format(project.id, node.id),
|
||||
{"x": 10,
|
||||
"y": 5,
|
||||
"z": 0})
|
||||
assert response.status == 201, response.body.decode()
|
||||
|
||||
|
||||
def test_delete_node(http_controller, tmpdir, project, compute, node):
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock()
|
||||
async def test_delete_node(controller_api, project, node, compute):
|
||||
|
||||
response = http_controller.delete("/projects/{}/nodes/{}".format(project.id, node.id), example=True)
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.delete("/projects/{}/nodes/{}".format(project.id, node.id))
|
||||
assert response.status == 204
|
||||
|
||||
|
||||
def test_dynamips_idle_pc(http_controller, tmpdir, project, compute, node):
|
||||
async def test_dynamips_idle_pc(controller_api, project, compute, node):
|
||||
|
||||
response = MagicMock()
|
||||
response.json = {"idlepc": "0x60606f54"}
|
||||
compute.get = AsyncioMagicMock(return_value=response)
|
||||
|
||||
response = http_controller.get("/projects/{}/nodes/{}/dynamips/auto_idlepc".format(project.id, node.id), example=True)
|
||||
response = await controller_api.get("/projects/{}/nodes/{}/dynamips/auto_idlepc".format(project.id, node.id))
|
||||
assert response.status == 200
|
||||
assert response.json["idlepc"] == "0x60606f54"
|
||||
|
||||
|
||||
def test_dynamips_idlepc_proposals(http_controller, tmpdir, project, compute, node):
|
||||
async def test_dynamips_idlepc_proposals(controller_api, project, compute, node):
|
||||
|
||||
response = MagicMock()
|
||||
response.json = ["0x60606f54", "0x33805a22"]
|
||||
compute.get = AsyncioMagicMock(return_value=response)
|
||||
|
||||
response = http_controller.get("/projects/{}/nodes/{}/dynamips/idlepc_proposals".format(project.id, node.id), example=True)
|
||||
response = await controller_api.get("/projects/{}/nodes/{}/dynamips/idlepc_proposals".format(project.id, node.id))
|
||||
assert response.status == 200
|
||||
assert response.json == ["0x60606f54", "0x33805a22"]
|
||||
|
||||
|
||||
def test_get_file(http_controller, tmpdir, project, node, compute):
|
||||
async def test_get_file(controller_api, project, node, compute):
|
||||
|
||||
response = MagicMock()
|
||||
response.body = b"world"
|
||||
compute.http_query = AsyncioMagicMock(return_value=response)
|
||||
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id), raw=True)
|
||||
|
||||
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id))
|
||||
assert response.status == 200
|
||||
assert response.body == b'world'
|
||||
|
||||
compute.http_query.assert_called_with("GET", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello".format(project_id=project.id, node_id=node.id), timeout=None, raw=True)
|
||||
|
||||
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id), raw=True)
|
||||
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id))
|
||||
assert response.status == 404
|
||||
|
||||
|
||||
def test_post_file(http_controller, tmpdir, project, node, compute):
|
||||
async def test_post_file(controller_api, project, node, compute):
|
||||
|
||||
compute.http_query = AsyncioMagicMock()
|
||||
response = http_controller.post("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
|
||||
response = await controller_api.post("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
|
||||
assert response.status == 201
|
||||
|
||||
compute.http_query.assert_called_with("POST", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello".format(project_id=project.id, node_id=node.id), data=b'hello', timeout=None, raw=True)
|
||||
|
||||
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id), raw=True)
|
||||
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id))
|
||||
assert response.status == 404
|
||||
|
||||
|
||||
def test_get_and_post_with_nested_paths_normalization(http_controller, tmpdir, project, node, compute):
|
||||
async def test_get_and_post_with_nested_paths_normalization(controller_api, project, node, compute):
|
||||
|
||||
response = MagicMock()
|
||||
response.body = b"world"
|
||||
compute.http_query = AsyncioMagicMock(return_value=response)
|
||||
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id), raw=True)
|
||||
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id))
|
||||
assert response.status == 200
|
||||
assert response.body == b'world'
|
||||
|
||||
compute.http_query.assert_called_with("GET", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello/nested".format(project_id=project.id, node_id=node.id), timeout=None, raw=True)
|
||||
|
||||
compute.http_query = AsyncioMagicMock()
|
||||
response = http_controller.post("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
|
||||
response = await controller_api.post("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
|
||||
assert response.status == 201
|
||||
|
||||
compute.http_query.assert_called_with("POST", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello/nested".format(project_id=project.id, node_id=node.id), data=b'hello', timeout=None, raw=True)
|
||||
|
Reference in New Issue
Block a user