diff --git a/gabbi/tests/gabbits_intercept/prefix.yaml b/gabbi/tests/gabbits_intercept/prefix.yaml new file mode 100644 index 0000000..3d6d0dc --- /dev/null +++ b/gabbi/tests/gabbits_intercept/prefix.yaml @@ -0,0 +1,20 @@ + +tests: + +- name: provide a link + POST: / + request_headers: + content-type: application/json + data: + link: $ENVIRON['GABBI_PREFIX']/barnabas + relative: link + +- name: get that link + GET: $RESPONSE['$.link'] + response_headers: + x-gabbi-url: "///[a-f0-9:-]+$ENVIRON['GABBI_PREFIX']/barnabas/" + +- name: get relative link + GET: $HISTORY['provide a link'].$RESPONSE['$.relative'] + response_headers: + x-gabbi-url: "///[a-f0-9:-]+$ENVIRON['GABBI_PREFIX']/link/" diff --git a/gabbi/utils.py b/gabbi/utils.py index ab1f4cf..ef1462c 100644 --- a/gabbi/utils.py +++ b/gabbi/utils.py @@ -52,9 +52,20 @@ def create_url(base_url, host, port=None, prefix='', ssl=False): query_string = parsed_url.query path = parsed_url.path - # Guard against a prefix of None - if prefix: - path = '%s%s' % (prefix, path) + # Guard against a prefix of None or the url already having the + # prefix. Without the startswith check, the tests in prefix.yaml + # fail. This is a pragmatic fix which does this for any URL in a + # test request that does not have a scheme and does not + # distinguish between URLs in a gabbi test file and those + # generated by the server. Idealy we would not mutate nor need + # to check URLs returned from the server. Doing that, however, + # would require more complex data handling than we have now and + # this covers most common cases and will be okay until someone + # reports a bug. + if prefix and not path.startswith(prefix): + prefix = prefix.rstrip('/') + path = path.lstrip('/') + path = '%s/%s' % (prefix, path) return urlparse.urlunsplit((scheme, netloc, path, query_string, '')) diff --git a/tox.ini b/tox.ini index ec25b0a..0b3660e 100644 --- a/tox.ini +++ b/tox.ini @@ -8,6 +8,7 @@ deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt install_command = pip install -U {opts} {packages} commands = python setup.py testr --testr-args="{posargs}" +setenv = GABBI_PREFIX= passenv = GABBI_* HOME [testenv:venv]