Skip to content

Commit 9dd965c

Browse files
committed
Clean up UI URL generation, added Backslash.get_ui_url helper method (fix #60)
1 parent 392c339 commit 9dd965c

8 files changed

Lines changed: 38 additions & 22 deletions

File tree

backslash/client.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ def __init__(self, url, runtoken):
2525
def url(self):
2626
return self._url
2727

28+
def get_ui_url(self, fragment=None):
29+
returned = str(self.url)
30+
if not returned.endswith('/'):
31+
returned += '/'
32+
if not fragment:
33+
fragment = '/'
34+
elif not fragment.startswith('/'):
35+
fragment = '/' + fragment
36+
returned += '#{}'.format(fragment)
37+
return returned
38+
39+
2840
def toggle_user_role(self, user_id, role):
2941
return self.api.call_function('toggle_user_role', {'user_id': user_id, 'role': role})
3042

backslash/contrib/slash_plugin.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def new_func(self, *args, **kwargs):
6060

6161
class BackslashPlugin(PluginInterface):
6262

63-
current_test = session = None
63+
client = current_test = session = None
6464

6565
def __init__(self, url=None, keepalive_interval=None, runtoken=None, propagate_exceptions=False):
6666
super(BackslashPlugin, self).__init__()
@@ -75,27 +75,22 @@ def __init__(self, url=None, keepalive_interval=None, runtoken=None, propagate_e
7575

7676
@property
7777
def rest_url(self):
78-
return URL(self._get_backslash_url()).add_path('rest')
78+
if self.client is None:
79+
return None
80+
return self.client.url.add_path('rest')
7981

8082
@property
8183
def webapp_url(self):
82-
return self._url_with_fragment('/')
84+
if self.client is None:
85+
return None
86+
return self.client.get_ui_url()
8387

8488
@property
8589
def session_webapp_url(self):
8690
session = slash.context.session
87-
if session is None:
91+
if session is None or self.client is None:
8892
return None
89-
return self._url_with_fragment('sessions/{}'.format(session.id))
90-
91-
def _url_with_fragment(self, fragment):
92-
returned = str(self._get_backslash_url())
93-
if not returned.endswith('/'):
94-
returned += '/'
95-
if not fragment.startswith('/'):
96-
fragment = '/' + fragment
97-
returned += '#{}'.format(fragment)
98-
return returned
93+
return self.client.get_ui_url('sessions/{}'.format(session.id))
9994

10095
def _handle_exception(self, exc_info):
10196
pass

backslash/session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class Session(APIObject, MetadataHolder, ErrorContainer, WarningContainer, Archi
1717

1818
@property
1919
def ui_url(self):
20-
return self.client.url + '#/sessions/{}'.format(self.logical_id or self.id)
20+
return self.client.get_ui_url('/sessions/{}'.format(self.logical_id or self.id))
2121

2222
def report_end(self, duration=NOTHING, has_fatal_errors=NOTHING):
2323

backslash/test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Test(APIObject, MetadataHolder, ErrorContainer, WarningContainer, Commenta
1414

1515
@property
1616
def ui_url(self):
17-
return self.client.url + '#/sessions/{}/tests/{}'.format(self.session_display_id, self.logical_id or self.id)
17+
return self.client.get_ui_url('sessions/{}/tests/{}'.format(self.session_display_id, self.logical_id or self.id))
1818

1919
def report_end(self, duration=NOTHING):
2020
self.client.api.call_function('report_test_end', {'id': self.id, 'duration': duration})

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Changelog
22
=========
33

4+
* :feature:`60` Clean up UI URL generation, added ``Backslash.get_ui_url`` helper method
45
* :feature:`58` Support reporting timing metrics
56
* :feature:`57` Support reporting test status description
67
* :release:`2.31.2 <14-9-2017>`

tests/test_api_object.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ def test_ui_url(client, object_type, logical_id, use_logical):
4949
url = obj.ui_url
5050
display_id = logical_id if use_logical else id
5151
if object_type is test.Test:
52-
assert url == client.url + '#/sessions/{}/tests/{}'.format(data['session_display_id'], display_id)
52+
assert url == client.url + '/#/sessions/{}/tests/{}'.format(data['session_display_id'], display_id)
5353
else:
54-
assert url == client.url + '#/{}s/{}'.format(object_type.__name__.lower(), display_id)
54+
assert url == client.url + '/#/{}s/{}'.format(object_type.__name__.lower(), display_id)
5555

5656

5757
@pytest.fixture

tests/test_slash_plugin.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,28 @@ def test_exception_distilling_surrounding_code(traceback):
3131

3232

3333
def test_rest_url(installed_plugin, server_url):
34+
installed_plugin.activate()
3435
assert installed_plugin.rest_url == server_url.add_path('rest')
3536

3637
def test_webapp_url(installed_plugin, server_url):
38+
installed_plugin.activate()
3739
expected = server_url
3840
if not expected.endswith('/'):
3941
expected += '/'
4042
expected += '#/'
4143
assert installed_plugin.webapp_url == expected
4244

45+
4346
def test_session_webapp_url_no_session(installed_plugin):
4447
assert installed_plugin.session_webapp_url is None
4548

4649
def test_session_webapp_url_with_session(installed_plugin, server_url):
50+
installed_plugin.activate()
4751
with slash.Session() as s:
4852
url = installed_plugin.session_webapp_url
4953
assert url == '{}/#/sessions/{}'.format(server_url, s.id)
5054

5155

52-
53-
54-
5556
@pytest.fixture
5657
def traceback(error_result):
5758
[e] = error_result.get_errors()
@@ -75,7 +76,7 @@ def test_failing():
7576
@pytest.fixture
7677
def installed_plugin(request, server_url):
7778
from backslash.contrib import slash_plugin
78-
plugin = slash_plugin.BackslashPlugin(url=str(server_url))
79+
plugin = slash_plugin.BackslashPlugin(url=str(server_url), runtoken='blap')
7980

8081
@request.addfinalizer
8182
def cleanup(): # pylint: disable=unused-variable

tests/test_urls.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from backslash import Backslash
2+
3+
4+
def test_client_get_ui_url():
5+
assert Backslash('http://bla.com', None).get_ui_url() == 'http://bla.com/#/'
6+
assert Backslash('http://bla.com', None).get_ui_url('/sessions') == 'http://bla.com/#/sessions'
7+
assert Backslash('http://bla.com', None).get_ui_url('sessions') == 'http://bla.com/#/sessions'

0 commit comments

Comments
 (0)