mirror of
https://github.com/gsi-upm/senpy
synced 2024-12-22 13:08:13 +00:00
54e4dcd5d4
This is still not functional, because it involves a LOT of changes to the basic structure of the project. Some of the main changes can be seen in the CHANGELOG.md file, if you're interested, but it boils down to simplifying the logic of plugins (no more activation/deactivation shenanigans), more robust typing and use of schemas (pydantic) to avoid inconsistencies and user errors.
263 lines
8.5 KiB
Python
263 lines
8.5 KiB
Python
#
|
|
# Copyright 2014 Grupo de Sistemas Inteligentes (GSI) DIT, UPM
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
from unittest import TestCase
|
|
from senpy.api import (boolean, parse_params, get_extra_params, parse_analyses,
|
|
API_PARAMS, NIF_PARAMS, WEB_PARAMS)
|
|
from senpy.errors import Error
|
|
from senpy.models import Plugin
|
|
|
|
|
|
class APITest(TestCase):
|
|
|
|
def test_api_params(self):
|
|
"""The API should not define any required parameters without a default"""
|
|
parse_params({}, API_PARAMS)
|
|
|
|
def test_web_params(self):
|
|
"""The WEB should not define any required parameters without a default"""
|
|
parse_params({}, WEB_PARAMS)
|
|
|
|
def test_basic(self):
|
|
a = {}
|
|
self.assertRaises(Error, parse_params, a)
|
|
self.assertRaises(Error, parse_params, a, NIF_PARAMS)
|
|
a = {'input': 'hello'}
|
|
p = parse_params(a, NIF_PARAMS)
|
|
assert 'input' in p
|
|
b = {'i': 'hello'}
|
|
p = parse_params(b, NIF_PARAMS)
|
|
assert 'input' in p
|
|
|
|
def test_plugin(self):
|
|
query = {}
|
|
plug_params = {
|
|
'hello': {
|
|
'aliases': ['hiya', 'hello'],
|
|
'required': True
|
|
}
|
|
}
|
|
self.assertRaises(Error, parse_params, plug_params)
|
|
query['hello'] = 'world'
|
|
p = parse_params(query, plug_params)
|
|
assert 'hello' in p
|
|
assert p['hello'] == 'world'
|
|
del query['hello']
|
|
|
|
query['hiya'] = 'dlrow'
|
|
p = parse_params(query, plug_params)
|
|
assert 'hello' in p
|
|
assert p['hello'] == 'dlrow'
|
|
|
|
def test_parameters2(self):
|
|
in1 = {
|
|
'meaningcloud-key': 5
|
|
}
|
|
in2 = {
|
|
'apikey': 25
|
|
}
|
|
extra_params: dict = {
|
|
"apikey": {
|
|
"aliases": [
|
|
"apikey",
|
|
"meaningcloud-key"
|
|
],
|
|
"required": True
|
|
}
|
|
}
|
|
p1 = parse_params(in1, extra_params)
|
|
p2 = parse_params(in2, extra_params)
|
|
assert (p2['apikey'] / p1['apikey']) == 5
|
|
|
|
def test_default(self):
|
|
spec = {
|
|
'hello': {
|
|
'required': True,
|
|
'default': 1
|
|
}
|
|
}
|
|
p = parse_params({}, spec)
|
|
assert 'hello' in p
|
|
assert p['hello'] == 1
|
|
|
|
def test_call(self):
|
|
call = {
|
|
'input': "Aloha my friend",
|
|
'algo': "Dummy"
|
|
}
|
|
p = parse_params(call, API_PARAMS, NIF_PARAMS)
|
|
assert 'algorithm' in p
|
|
assert "Dummy" in p['algorithm']
|
|
assert 'input' in p
|
|
assert p['input'] == 'Aloha my friend'
|
|
|
|
def test_parse_analyses(self):
|
|
'''The API should parse user parameters and return them in a format that plugins can use'''
|
|
plugins = [
|
|
Plugin.parse_obj({
|
|
'name': 'plugin1',
|
|
'extra_params': {
|
|
# Incompatible parameter
|
|
'param0': {
|
|
'aliases': ['p1', 'parameter1'],
|
|
'options': ['option1', 'option2'],
|
|
'default': 'option1',
|
|
'required': True
|
|
},
|
|
'param1': {
|
|
'aliases': ['p1', 'parameter1'],
|
|
'options': ['en', 'es'],
|
|
|
|
'default': 'en',
|
|
'required': False
|
|
},
|
|
'param2': {
|
|
'aliases': ['p2', 'parameter2'],
|
|
'required': False,
|
|
'options': ['value2_1', 'value2_2', 'value3_3']
|
|
}
|
|
}
|
|
}), Plugin.parse_obj({
|
|
'name': 'plugin2',
|
|
'extra_params': {
|
|
'param0': {
|
|
'aliases': ['parameter1'],
|
|
'options': ['new option', 'new option2'],
|
|
'default': 'new option',
|
|
'required': False
|
|
},
|
|
'param1': {
|
|
'aliases': ['myparam1', 'p1'],
|
|
'options': ['en', 'de', 'auto'],
|
|
'default': 'de',
|
|
'required': True
|
|
},
|
|
'param3': {
|
|
'aliases': ['p3', 'parameter3'],
|
|
'options': boolean,
|
|
'default': True
|
|
}
|
|
}
|
|
})
|
|
]
|
|
call = {
|
|
'param1': 'en',
|
|
'0.param0': 'option1',
|
|
'0.param1': 'en',
|
|
'param2': 'value2_1',
|
|
'param0': 'new option',
|
|
'1.param1': 'de',
|
|
'param3': False,
|
|
}
|
|
expected = [
|
|
{
|
|
'param0': 'option1',
|
|
'param1': 'en',
|
|
'param2': 'value2_1',
|
|
}, {
|
|
'param0': 'new option',
|
|
'param1': 'de',
|
|
'param3': False,
|
|
}
|
|
|
|
]
|
|
p = parse_analyses(call, plugins)
|
|
for i, arg in enumerate(expected):
|
|
params = p[i].params
|
|
for k, v in arg.items():
|
|
assert params[k] == v
|
|
|
|
def test_get_extra_params(self):
|
|
'''The API should return the list of valid parameters for a set of plugins'''
|
|
plugins = [
|
|
Plugin.parse_obj({
|
|
'name': 'plugin1',
|
|
'extra_params': {
|
|
# Incompatible parameter
|
|
'param0': {
|
|
'aliases': ['p1', 'parameter1'],
|
|
'options': ['option1', 'option2'],
|
|
'default': 'option1',
|
|
'required': True
|
|
},
|
|
'param1': {
|
|
'aliases': ['p1', 'parameter1'],
|
|
'options': ['en', 'es'],
|
|
'default': 'en',
|
|
'required': False
|
|
},
|
|
'param2': {
|
|
'aliases': ['p2', 'parameter2'],
|
|
'required': False,
|
|
'options': ['value2_1', 'value2_2', 'value3_3']
|
|
}
|
|
}
|
|
}), Plugin.parse_obj({
|
|
'name': 'plugin2',
|
|
'extra_params': {
|
|
'param0': {
|
|
'aliases': ['parameter1'],
|
|
'options': ['new option', 'new option2'],
|
|
'default': 'new option',
|
|
'required': False
|
|
},
|
|
'param1': {
|
|
'aliases': ['myparam1', 'p1'],
|
|
'options': ['en', 'de', 'auto'],
|
|
'default': 'de',
|
|
'required': True
|
|
},
|
|
'param3': {
|
|
'aliases': ['p3', 'parameter3'],
|
|
'options': boolean,
|
|
'default': True
|
|
}
|
|
}
|
|
})
|
|
]
|
|
|
|
expected = {
|
|
# Overlapping parameters
|
|
'plugin1.param0': plugins[0].extra_params['param0'],
|
|
'plugin1.param1': plugins[0].extra_params['param1'],
|
|
'plugin2.param0': plugins[1].extra_params['param0'],
|
|
'plugin2.param1': plugins[1].extra_params['param1'],
|
|
|
|
# Non-overlapping parameters
|
|
'param2': plugins[0].extra_params['param2'],
|
|
'param3': plugins[1].extra_params['param3'],
|
|
|
|
# Intersection of overlapping parameters
|
|
'param1': {
|
|
'aliases': ['p1'],
|
|
'options': ['en'],
|
|
'default': None,
|
|
'required': True
|
|
}
|
|
}
|
|
|
|
result = get_extra_params(plugins)
|
|
|
|
for ik, iv in expected.items():
|
|
assert ik in result
|
|
for jk, jv in iv.items():
|
|
assert jk in result[ik]
|
|
assert expected[ik][jk] == result[ik][jk]
|