
A followup change is going to require that we set the submitWholeTopic value in our fake gerrit at the start of the test setup sequence (instead of after zuul has already started as we do now). The best way to do that is to add a test decorator so that we can set the value for the test methods that require it. Because we are plumbing an increasing number of what are effectively per-test variables to many different places in the tests, let's centralize these values so that we don't have to pass them all around explicitly. This adds a TestConfig class which holds some test-specific variables, including the global fake change database, and passes this new object around instead of several individual values. There is room for adding more variables in the future and simplifying the class and function signatures of many methods, but this is a start. Change-Id: I514744b1ecca536fd844ed28d29fac3b6ca73a04
125 lines
4.0 KiB
Python
125 lines
4.0 KiB
Python
# Copyright 2017 Red Hat, Inc.
|
|
#
|
|
# 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 json
|
|
import urllib
|
|
|
|
from bs4 import BeautifulSoup
|
|
|
|
from tests.base import ZuulTestCase, WebProxyFixture
|
|
from tests.base import ZuulWebFixture
|
|
|
|
|
|
class TestWebURLs(ZuulTestCase):
|
|
tenant_config_file = 'config/single-tenant/main.yaml'
|
|
|
|
def setUp(self):
|
|
super(TestWebURLs, self).setUp()
|
|
self.web = self.useFixture(
|
|
ZuulWebFixture(self.config, self.test_config,
|
|
self.additional_event_queues, self.upstream_root,
|
|
self.poller_events,
|
|
self.git_url_with_auth, self.addCleanup,
|
|
self.test_root))
|
|
|
|
def _get(self, port, uri):
|
|
url = "http://localhost:{}{}".format(port, uri)
|
|
self.log.debug("GET {}".format(url))
|
|
req = urllib.request.Request(url)
|
|
try:
|
|
f = urllib.request.urlopen(req)
|
|
except urllib.error.HTTPError:
|
|
raise Exception("Error on URL {}".format(url))
|
|
return f.read()
|
|
|
|
def _crawl(self, url):
|
|
page = self._get(self.port, url)
|
|
page = BeautifulSoup(page, 'html.parser')
|
|
for (tag, attr) in [
|
|
('script', 'src'),
|
|
('link', 'href'),
|
|
('a', 'href'),
|
|
('img', 'src'),
|
|
]:
|
|
for item in page.find_all(tag):
|
|
suburl = item.get(attr)
|
|
if tag == 'script' and suburl is None:
|
|
# There can be an embedded script
|
|
continue
|
|
if suburl.startswith('/'):
|
|
suburl = suburl[1:]
|
|
link = urllib.parse.urljoin(url, suburl)
|
|
self._get(self.port, link)
|
|
|
|
|
|
class TestDirect(TestWebURLs):
|
|
# Test directly accessing the zuul-web server with no proxy
|
|
def setUp(self):
|
|
super(TestDirect, self).setUp()
|
|
self.port = self.web.port
|
|
|
|
def test_status_page(self):
|
|
self._crawl('/')
|
|
self._crawl('/t/tenant-one/status')
|
|
|
|
|
|
class TestWhiteLabel(TestWebURLs):
|
|
# Test a zuul-web behind a whitelabel proxy (i.e., what
|
|
# zuul.openstack.org does).
|
|
def setUp(self):
|
|
super(TestWhiteLabel, self).setUp()
|
|
rules = [
|
|
('^/(.*)$', 'http://localhost:{}/\\1'.format(self.web.port)),
|
|
]
|
|
self.proxy = self.useFixture(WebProxyFixture(rules))
|
|
self.port = self.proxy.port
|
|
|
|
def test_status_page(self):
|
|
self._crawl('/')
|
|
self._crawl('/status')
|
|
|
|
|
|
class TestWhiteLabelAPI(TestWebURLs):
|
|
# Test a zuul-web behind a whitelabel proxy (i.e., what
|
|
# zuul.openstack.org does).
|
|
def setUp(self):
|
|
super(TestWhiteLabelAPI, self).setUp()
|
|
rules = [
|
|
('^/api/(.*)$',
|
|
'http://localhost:{}/api/tenant/tenant-one/\\1'.format(
|
|
self.web.port)),
|
|
]
|
|
self.proxy = self.useFixture(WebProxyFixture(rules))
|
|
self.port = self.proxy.port
|
|
|
|
def test_info(self):
|
|
info = json.loads(self._get(self.port, '/api/info').decode('utf-8'))
|
|
self.assertEqual('tenant-one', info['info']['tenant'])
|
|
|
|
|
|
class TestSuburl(TestWebURLs):
|
|
# Test a zuul-web mounted on a suburl (i.e., what software factory
|
|
# does).
|
|
def setUp(self):
|
|
super(TestSuburl, self).setUp()
|
|
rules = [
|
|
('^/zuul/(.*)$', 'http://localhost:{}/\\1'.format(
|
|
self.web.port)),
|
|
]
|
|
self.proxy = self.useFixture(WebProxyFixture(rules))
|
|
self.port = self.proxy.port
|
|
|
|
def test_status_page(self):
|
|
self._crawl('/zuul/')
|