Skip to content

Commit

Permalink
[qatl] added method named 'tl.getFirstLevelTestSuitesForTestProject'
Browse files Browse the repository at this point in the history
+ added model TSuite
+ flake8 +pylint FIXes
  • Loading branch information
crypto netzulo committed Dec 25, 2017
1 parent aeedb0e commit 0936e86
Show file tree
Hide file tree
Showing 6 changed files with 165 additions and 29 deletions.
60 changes: 57 additions & 3 deletions qatestlink/core/models/tl_models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# -*- coding: utf-8 -*-
# pylint: disable=invalid-name
# pylint: disable=too-few-public-methods
# pylint: disable=too-many-instance-attributes
"""TODO: doc module"""


Expand Down Expand Up @@ -43,7 +46,7 @@ def __init__(self, res_members):
'Bad param, res_member can\'t be empty list')
self._res_members = res_members
self._load()

def _load(self):
for res_member in self._res_members:
name = res_member.name
Expand Down Expand Up @@ -116,7 +119,7 @@ def __init__(self, res_members):
'Bad param, res_member can\'t be empty list')
self._res_members = res_members
self._load()

def _load(self):
for res_member in self._res_members:
name = res_member.name
Expand All @@ -135,9 +138,60 @@ def _load(self):
self.notes = value

def __repr__(self):
return "TProject: id={}, name={}, is_public={}".format(
return "TPlan: id={}, name={}, is_public={}".format(
self.id,
self.name,
self.is_public
)




class TSuite(ModelBase):
"""TODO: doc class"""

_res_members = None

# Testlink object properties
id = None
name = None
parent_id = None
node_type_id = None
node_order = None
node_table = None


def __init__(self, res_members):
"""TODO: doc method"""
super(TSuite, self).__init__()
if res_members is None:
raise Exception('Bad param, res_member can\'t be None')
if len(res_members) <= 0:
raise Exception(
'Bad param, res_member can\'t be empty list')
self._res_members = res_members
self._load()

def _load(self):
for res_member in self._res_members:
name = res_member.name
value = res_member.value
if name == 'id':
self.id = value
if name == 'name':
self.name = value
if name == 'parent_id':
self.parent_id = value
if name == 'node_type_id':
self.node_type_id = value
if name == 'node_order':
self.node_order = value
if name == 'node_table':
self.node_table = value

def __repr__(self):
return "TSuite: id={}, name={}, parent_id={}".format(
self.id,
self.name,
self.parent_id
)
35 changes: 21 additions & 14 deletions qatestlink/core/testlink_manager.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
# pylint: disable=invalid-name
"""Testlink Managers"""


from qatestlink.core.utils.Utils import read_file
from qatestlink.core.utils.Utils import settings as settings_func
from qatestlink.core.utils.logger_manager import LoggerManager
from qatestlink.core.connections.connection_base import ConnectionBase
from qatestlink.core.xmls.xmlrpc_manager import XMLRPCManager
Expand All @@ -25,7 +26,7 @@ class TLManager(object):

log = None

def __init__(self, settings_path=None, settings=None):
def __init__(self, file_path=None, file_name=None, settings=None):
"""
This instance allow to handle requests+reponses to/from XMLRPC
just need settings_path and settings dict loaded to works
Expand All @@ -37,7 +38,12 @@ def __init__(self, settings_path=None, settings=None):
'qatestlink/configs/settings.json'
"""
if settings is None:
settings = self.get_settings(json_path=settings_path)
if file_path is None or file_name is None:
settings = settings_func()
else:
settings = settings_func(
file_path=file_path,
file_name=file_name)
self._settings = settings
self._logger_manager = LoggerManager(
self._settings.get('log_level'))
Expand All @@ -51,16 +57,6 @@ def __init__(self, settings_path=None, settings=None):
port=conn.get('port'),
is_https=conn.get('is_https'))

def get_settings(self, json_path=None):
"""
Get default settings path or search on param path
to load as a dict and return it
"""
json_path_selected = PATH_CONFIG
if json_path is not None:
json_path_selected = json_path
return read_file(file_path=json_path_selected, is_json=True)

def api_login(self, dev_key=None):
"""Call to method named 'checkDevKey' for testlink XMLRPC"""
if dev_key is None:
Expand Down Expand Up @@ -108,7 +104,18 @@ def api_tproject_tplans(self, tproject_id, dev_key=None):
dev_key, tproject_id)
res = self._conn.post(self._xml_manager.headers, req_data)
self._xml_manager.parse_errors(res.text)
# TODO: make works
res_as_models = self._xml_manager.res_tproject_tplans(
res.status_code, res.text, as_models=True)
return res_as_models

def api_tproject_tsuites_first_level(self, tproject_id, dev_key=None):
"""Call to method named 'tl.getFirstLevelTestSuitesForTestProject'"""
if dev_key is None:
dev_key = self._settings.get('dev_key')
req_data = self._xml_manager.req_tproject_tsuites_first_level(
dev_key, tproject_id)
res = self._conn.post(self._xml_manager.headers, req_data)
self._xml_manager.parse_errors(res.text)
res_as_models = self._xml_manager.res_tproject_tsuites_first_level(
res.status_code, res.text, as_models=True)
return res_as_models
6 changes: 2 additions & 4 deletions qatestlink/core/xmls/error_handler.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
# pylint: disable=too-many-locals
# pylint: disable=useless-super-delegation
"""TODO: doc module"""


Expand Down Expand Up @@ -54,16 +56,12 @@ def get_response_error(self, xml_str):
if len(node_struct_members) != 2:
return
# 1º member
node_name_one = self.find_node('name', parent=node_struct_members[0])
node_value_one = self.find_node('value', parent=node_struct_members[0])
node_value_type_one = self.find_node('int', parent=node_value_one)
# 2º member
node_name_second = self.find_node('name', parent=node_struct_members[1])
node_value_second = self.find_node('value', parent=node_struct_members[1])
node_value_type_second = self.find_node('string', parent=node_value_second)
# build response error
code = int(node_value_type_one.text)
message = str(node_value_type_second.text)
raise ResponseException(code, self.log, message=message)


56 changes: 54 additions & 2 deletions qatestlink/core/xmls/xmlrpc_manager.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
# pylint: disable=invalid-name
"""XMLRPC managers"""

from qatestlink.core.xmls.route_type import RouteType
Expand All @@ -8,6 +9,7 @@
from qatestlink.core.xmls.base_handler import BaseHandler
from qatestlink.core.models.tl_models import TProject
from qatestlink.core.models.tl_models import TPlan
from qatestlink.core.models.tl_models import TSuite



Expand Down Expand Up @@ -65,7 +67,7 @@ def res_check_dev_key(self, status_code, res_str):
def req_tprojects(self, dev_key):
"""
Obtains all test projects created on remote
testlink database,
testlink database,
TODO: can filter with any property+value combination
:return:
Expand Down Expand Up @@ -155,7 +157,7 @@ def req_tproject_tplans(self, dev_key, tproject_id):
"""
Obtains all test plans asigned to test project
created on remote testlink database,
can filter by project name
can filter by project id
:return:
List of TPlan objects containing all database
Expand Down Expand Up @@ -200,3 +202,53 @@ def res_tproject_tplans(self, status_code, res_str, as_models=True):
tplan = TPlan(res_members)
tplans.append(tplan)
return tplans

def req_tproject_tsuites_first_level(self, dev_key, tproject_id):
"""
Obtains all test suites of first level into test project
created on remote testlink database,
can filter by project id
:return:
List of TSuite objects containing all database
data loaded
"""
if tproject_id is None:
raise Exception("Can't call XMLRPC without param, tproject_id")
req = self._request_handler.create(
RouteType.TPROJECT_TSUITES_FIRST_LEVEL)
req = self._request_handler.create_param(
req, 'struct', 'devKey', dev_key)
req = self._request_handler.add_param(
req, 'testprojectid', tproject_id)
return req


def res_tproject_tsuites_first_level(self, status_code, res_str, as_models=True):
"""
Parse and validate response for method
named 'tl.getFirstLevelTestSuitesForTestProject', by default
response list of TSuite objects, can response xml string too
:return:
if as_models is True
list of objects instanced with
Model classes
if as_models is False
string xml object ready to
parse/write/find/add Elements on it
"""
if status_code != 200:
raise Exception(
"status_code invalid: code={}".format(
status_code))
res = self._response_handler.create(
RouteType.TPROJECT_TSUITES_FIRST_LEVEL, res_str)
if not as_models:
return res
res_members_list = self._response_handler.get_response_members(
xml_str=res)
tsuites = list()
for res_members in res_members_list:
tsuite = TSuite(res_members)
tsuites.append(tsuite)
return tsuites
4 changes: 1 addition & 3 deletions tests/unitaries/suite_001_connections.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@

import logging
from unittest import TestCase
from unittest import skip
from qatestlink.core.testlink_manager import TLManager
from qatestlink.core.models.tl_models import TProject
from qatestlink.core.exceptions.response_exception import ResponseException


Expand Down Expand Up @@ -65,4 +63,4 @@ def test_001_raises_connemptydevkey(self):
"""TODO: doc method"""
self.assertRaises(
ResponseException,
self.testlink_manager.api_login, dev_key='')
self.testlink_manager.api_login, dev_key='')
33 changes: 30 additions & 3 deletions tests/unitaries/suite_002_methods.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
# pylint: disable=invalid-name
"""TODO: doc module"""


Expand All @@ -9,6 +10,7 @@
from qatestlink.core.testlink_manager import TLManager
from qatestlink.core.models.tl_models import TProject
from qatestlink.core.models.tl_models import TPlan
from qatestlink.core.models.tl_models import TSuite


API_DEV_KEY = 'ae2f4839476bea169f7461d74b0ed0ac'
Expand Down Expand Up @@ -62,6 +64,17 @@ def test_003_method_tproject_tplans(self):
self.testlink_manager.log.debug(repr(tplan))
self.assertIsInstance(tplan, TPlan)

@skipIf(SKIP, 'Test SKIPPED')
def test_004_method_tproject_tsuites_first_level(self):
"""TODO: doc method"""
tsuites = self.testlink_manager.api_tproject_tsuites_first_level(
CONFIG['tproject_id'])
self.assertIsInstance(tsuites, list)
self.assertGreater(len(tsuites), 0)
for tsuite in tsuites:
self.testlink_manager.log.debug(repr(tsuite))
self.assertIsInstance(tsuite, TSuite)

class TestMethodsRaises(TestCase):
"""TODO: doc class"""

Expand All @@ -82,15 +95,15 @@ def test_001_raises_tproject_notname(self):
"""TODO: doc method"""
self.assertRaises(
Exception, self.testlink_manager.api_tproject)

@skipIf(SKIP, 'Test SKIPPED')
def test_002_raises_tproject_emptyname(self):
"""TODO: doc method"""
self.assertRaises(
ResponseException,
self.testlink_manager.api_tproject,
'')

@skipIf(SKIP, 'Test SKIPPED')
def test_003_raises_tproject_tplans_notid(self):
"""TODO: doc method"""
Expand All @@ -103,4 +116,18 @@ def test_004_raises_tproject_tplans_notfoundid(self):
self.assertRaises(
ResponseException,
self.testlink_manager.api_tproject_tplans,
-1)
-1)

@skipIf(SKIP, 'Test SKIPPED')
def test_005_raises_tproject_tsuites_first_level_notid(self):
"""TODO: doc method"""
self.assertRaises(
Exception, self.testlink_manager.api_tproject_tsuites_first_level)

@skipIf(SKIP, 'Test SKIPPED')
def test_006_raises_tproject_tsuites_first_level_notfoundid(self):
"""TODO: doc method"""
self.assertRaises(
ResponseException,
self.testlink_manager.api_tproject_tsuites_first_level,
-1)

0 comments on commit 0936e86

Please sign in to comment.