def test_reload_prod(capfd: Capture, faker: Faker) -> None: create_project( capfd=capfd, name=random_project_name(faker), auth="no", frontend="angular", ) init_project(capfd, " --prod ", "--force") start_registry(capfd) pull_images(capfd) start_project(capfd) time.sleep(5) exec_command(capfd, "reload backend", "Reloading gunicorn (PID #") exec_command( capfd, "reload", "Can't reload the frontend if not explicitly requested", "Services reloaded", ) docker = Docker() container = docker.get_container("frontend") assert container is not None docker.client.container.stop(container[0]) exec_command(capfd, "reload frontend", "Reloading frontend...") container = docker.get_container("frontend") if Configuration.swarm_mode: # frontend reload is always execute in compose mode # => the container retrieved from docker.get_container in swarm mode is None assert container is None # Let's retrieve the container name in compose mode: Configuration.swarm_mode = False docker = Docker() container = docker.get_container("frontend") # Let's restore the docker client Configuration.swarm_mode = True docker = Docker() assert container is not None docker.client.container.remove(container[0], force=True) exec_command(capfd, "reload frontend", "Reloading frontend...") exec_command( capfd, "reload frontend backend", "Can't reload frontend and other services at once", ) exec_command(capfd, "remove", "Stack removed")
def test_projects(self): """ Test the projects function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/projects/') self.assertEqual(output.status_code, 200) expected = """ <a href="http://www.geany.org/" target="_blank"> http://www.geany.org/ </a>""" self.assertTrue(expected in output.data) expected = """ <a href="https://fedorahosted.org/r2spec/" target="_blank"> https://fedorahosted.org/r2spec/ </a>""" self.assertTrue(expected in output.data) expected = """ <a href="http://subsurface.hohndel.org/" target="_blank"> http://subsurface.hohndel.org/ </a>""" self.assertTrue(expected in output.data) self.assertEqual(output.data.count('<a href="/project/'), 3) output = self.app.get('/projects/?page=ab') self.assertEqual(output.status_code, 200) self.assertEqual(output.data.count('<a href="/project/'), 3)
def test_git(capfd: Capture, faker: Faker) -> None: create_project( capfd=capfd, name=random_project_name(faker), ) init_project(capfd) assert git.get_repo("does/not/exist") is None do_repo = git.get_repo("submodules/do") assert do_repo is not None assert git.get_active_branch(None) is None assert git.get_active_branch(do_repo) == __version__ assert not git.switch_branch(None, branch_name="0.7.3") # Same branch => no change => return True assert git.switch_branch(do_repo, branch_name=__version__) assert not git.switch_branch(do_repo, branch_name="XYZ") assert git.switch_branch(do_repo, branch_name="0.7.3") assert git.get_active_branch(do_repo) == "0.7.3" assert git.switch_branch(do_repo, branch_name=__version__) assert git.get_active_branch(do_repo) == __version__ assert git.get_origin(None) is None r = git.get_repo(".") assert git.get_origin(r) == "https://your_remote_git/your_project.git" # Create an invalid repo (i.e. without any remote) r = git.init("../justatest") assert git.get_origin(r) is None
def test_projects_search(self): """ Test the projects_search function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/projects/search/g') self.assertEqual(output.status_code, 200) self.assertEqual(output.data.count('<a href="/project/'), 1) output = self.app.get('/projects/search/g*') self.assertEqual(output.status_code, 200) expected = """ <a href="http://www.geany.org/" target="_blank"> http://www.geany.org/ </a>""" self.assertTrue(expected in output.data) self.assertEqual(output.data.count('<a href="/project/'), 1) output = self.app.get('/projects/search/?page=ab') self.assertEqual(output.status_code, 200) self.assertTrue(expected in output.data) self.assertEqual(output.data.count('<a href="/project/'), 3) output = self.app.get('/projects/search/geany*', follow_redirects=True) self.assertEqual(output.status_code, 200) expected = '<li class="list-group-item list-group-item-default">' \ 'Only one result matching with an ' \ 'exact match, redirecting</li>' self.assertTrue(expected in output.data)
def test_api_projects_names(self): """ Test the api_projects_names function of the API. """ create_distro(self.session) output = self.app.get('/api/projects/names') self.assertEqual(output.status_code, 200) data = _read_json(output) exp = {"projects": [], "total": 0} self.assertEqual(data, exp) create_project(self.session) create_package(self.session) output = self.app.get('/api/projects/names/') self.assertEqual(output.status_code, 200) data = _read_json(output) exp = {"projects": ["geany", "R2spec", "subsurface"], "total": 3} self.assertEqual(data, exp) output = self.app.get('/api/projects/names/?pattern=ge') self.assertEqual(output.status_code, 200) data = _read_json(output) exp = {"projects": ["geany"], "total": 1} self.assertEqual(data, exp)
def test_log_search(self): """ Test the Log.search function. """ create_project(self.session) logs = model.Log.search(self.session) self.assertEqual(len(logs), 3) self.assertEqual(logs[0].description, '[email protected] added project: R2spec') self.assertEqual( logs[1].description, '[email protected] added project: subsurface') self.assertEqual(logs[2].description, '[email protected] added project: geany') logs = model.Log.search(self.session, count=True) self.assertEqual(logs, 3) from_date = datetime.datetime.utcnow().date() - datetime.timedelta( days=1) logs = model.Log.search(self.session, from_date=from_date, offset=1, limit=1) self.assertEqual(len(logs), 1) self.assertEqual( logs[0].description, '[email protected] added project: subsurface') logs = model.Log.search(self.session, project_name='subsurface') self.assertEqual(len(logs), 1) self.assertEqual( logs[0].description, '[email protected] added project: subsurface')
def test_reload_dev(capfd: Capture, faker: Faker) -> None: create_project( capfd=capfd, name=random_project_name(faker), auth="no", frontend="no", ) init_project(capfd) start_registry(capfd) pull_images(capfd) start_project(capfd) time.sleep(5) # For each support service verify: # 1) a start line in the logs # 2) the container is not re-created after the command # 3) the start line in the logs is printed again # 4) some more deep check based on the service? # For example API is loading a change in the code? exec_command(capfd, "reload backend", "Reloading Flask...") exec_command(capfd, "remove", "Stack removed") if Configuration.swarm_mode: exec_command(capfd, "remove registry", "Service registry removed")
def test_projects_search(self): """ Test the projects_search function. """ create_distro(self.session) create_project(self.session) output = self.app.get("/projects/search/g") self.assertEqual(output.status_code, 200) self.assertEqual(output.data.count(b'<a href="/project/'), 1) output = self.app.get("/projects/search/g*") self.assertEqual(output.status_code, 200) expected = b""" <a href="http://www.geany.org/" target="_blank"> http://www.geany.org/ </a>""" self.assertTrue(expected in output.data) self.assertEqual(output.data.count(b'<a href="/project/'), 1) output = self.app.get("/projects/search/?page=ab") self.assertEqual(output.status_code, 200) self.assertTrue(expected in output.data) self.assertEqual(output.data.count(b'<a href="/project/'), 3) output = self.app.get("/projects/search/geany*", follow_redirects=True) self.assertEqual(output.status_code, 200) expected = ( b'<li class="list-group-item list-group-item-default">' b"Only one result matching with an " b"exact match, redirecting</li>" ) self.assertTrue(expected in output.data)
def test_distro(self): """ Test the distro function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/distro/Fedora/') self.assertEqual(output.status_code, 200) expected = """ <blockquote> Oups this is embarrassing, it seems that no projects are being monitored currently. </blockquote>""" self.assertTrue(expected in output.data) self.assertTrue( 'form action="/distro/Fedora/search/" role="form">' in output.data) self.assertTrue( '<h1>Projects of Fedora monitored</h1>' in output.data) output = self.app.get('/distro/Fedora/?page=ab') self.assertEqual(output.status_code, 200) self.assertTrue(expected in output.data) self.assertTrue( 'form action="/distro/Fedora/search/" role="form">' in output.data) self.assertTrue( '<h1>Projects of Fedora monitored</h1>' in output.data)
def test_distro_repr(self): """ Test the __repr__ function of Project. """ create_project(self.session) obs = '<Project(geany, http://www.geany.org/)>' project = model.Project.by_id(self.session, 1) self.assertEqual(str(project), obs)
def test_log_search(self): """ Test the Log.search function. """ create_project(self.session) logs = model.Log.search(self.session) self.assertEqual(len(logs), 3) self.assertEqual( logs[0].description, '[email protected] added project: R2spec') self.assertEqual( logs[1].description, '[email protected] added project: subsurface') self.assertEqual( logs[2].description, '[email protected] added project: geany') logs = model.Log.search(self.session, count=True) self.assertEqual(logs, 3) from_date = datetime.datetime.utcnow().date() - datetime.timedelta(days=1) logs = model.Log.search( self.session, from_date=from_date, offset=1, limit=1) self.assertEqual(len(logs), 1) self.assertEqual( logs[0].description, '[email protected] added project: subsurface') logs = model.Log.search(self.session, project_name='subsurface') self.assertEqual(len(logs), 1) self.assertEqual( logs[0].description, '[email protected] added project: subsurface')
def test_base(capfd: Capture) -> None: execute_outside(capfd, "update") create_project( capfd=capfd, name="third", auth="postgres", frontend="angular", ) init_project(capfd) # Skipping main because we are on a fake git repository exec_command( capfd, "update -i main", "All updated", ) open("submodules/do/temp.file", "a").close() with open("submodules/do/setup.py", "a") as f: f.write("# added from tests\n") exec_command( capfd, "update -i main", "Unable to update do repo, you have unstaged files", "Untracked files:", "submodules/do/temp.file", "Changes not staged for commit:", "submodules/do/setup.py", "Can't continue with updates", )
def test_distro(self): """ Test the distro function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/distro/Fedora/') self.assertEqual(output.status_code, 200) expected = b""" <blockquote> Oups this is embarrassing, it seems that no projects are being monitored currently. </blockquote>""" self.assertTrue(expected in output.data) self.assertTrue(b'form action="/distro/Fedora/search/" role="form" ' b'class="form-inline">' in output.data) self.assertTrue( b'<h1>Projects of Fedora monitored</h1>' in output.data) output = self.app.get('/distro/Fedora/?page=ab') self.assertEqual(output.status_code, 200) self.assertTrue(expected in output.data) self.assertTrue(b'form action="/distro/Fedora/search/" role="form" ' b'class="form-inline">' in output.data) self.assertTrue( b'<h1>Projects of Fedora monitored</h1>' in output.data)
def test_projects_search(self): """ Test the projects_search function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/projects/search/g') self.assertEqual(output.status_code, 200) expected = """ <a href="http://www.geany.org/" target="_blank"> http://www.geany.org/ </a>""" self.assertTrue(expected in output.data) self.assertEqual(output.data.count('<a href="/project/'), 1) output = self.app.get('/projects/search/?page=ab') self.assertEqual(output.status_code, 200) self.assertTrue(expected in output.data) self.assertEqual(output.data.count('<a href="/project/'), 3) output = self.app.get( '/projects/search/geany*', follow_redirects=True) self.assertEqual(output.status_code, 200) expected = '<li class="message">Only one result matching with an '\ 'exact match, redirecting</li>' self.assertTrue(expected in output.data)
def test_packages__repr__(self): """ Test the Packages.__repr__ function. """ create_project(self.session) create_distro(self.session) create_package(self.session) pkg = model.Packages.by_id(self.session, 1) self.assertEqual(str(pkg), '<Packages(1, Fedora: geany)>')
def test_packages_by_id(self): """ Test the Packages.by_id function. """ create_project(self.session) create_distro(self.session) create_package(self.session) pkg = model.Packages.by_id(self.session, 1) self.assertEqual(pkg.package_name, 'geany') self.assertEqual(pkg.distro, 'Fedora')
def test_project_init(self): """ Test the __init__ function of Project. """ create_project(self.session) self.assertEqual(3, model.Project.all(self.session, count=True)) projects = model.Project.all(self.session) self.assertEqual(projects[0].name, 'geany') self.assertEqual(projects[1].name, 'R2spec') self.assertEqual(projects[2].name, 'subsurface')
def test_init_project(self): """ Test the __init__ function of Project. """ create_project(self.session) self.assertEqual(3, model.Project.all(self.session, count=True)) projects = model.Project.all(self.session) self.assertEqual(projects[0].name, 'geany') self.assertEqual(projects[1].name, 'R2spec') self.assertEqual(projects[2].name, 'subsurface')
def test_project_by_name(self): """ Test the by_name function of Project. """ create_project(self.session) project = model.Project.by_name(self.session, 'geany') self.assertEqual(project[0].name, 'geany') self.assertEqual(project[0].homepage, 'http://www.geany.org/') project = model.Project.by_name(self.session, 'terminal') self.assertEqual(project, [])
def test_project_search(self): """ Test the search function of Project. """ create_project(self.session) projects = model.Project.search(self.session, 'gea') self.assertEqual(projects, []) projects = model.Project.search(self.session, 'gea*') self.assertEqual(projects[0].name, 'geany') self.assertEqual(projects[0].homepage, 'http://www.geany.org/')
def test_project_search(self): """ Test the Project.search function. """ create_project(self.session) projects = model.Project.search(self.session, '*', count=True) self.assertEqual(projects, 3) projects = model.Project.search(self.session, '*', page=2) self.assertEqual(len(projects), 0) projects = model.Project.search(self.session, '*', page='asd') self.assertEqual(len(projects), 3)
def test_api_get_project_distro(self): """ Test the api_get_project_distro function of the API. """ create_distro(self.session) output = self.app.get('/api/project/Fedora/geany') self.assertEqual(output.status_code, 404) data = json.loads(output.data) exp = { "error": "No package \"geany\" found in distro \"Fedora\"", "output": "notok" } self.assertEqual(data, exp) create_project(self.session) create_package(self.session) output = self.app.get('/api/project/Fedora/gnome-terminal/') self.assertEqual(output.status_code, 404) data = json.loads(output.data) exp = { "error": "No package \"gnome-terminal\" found in distro " "\"Fedora\"", "output": "notok" } self.assertEqual(data, exp) output = self.app.get('/api/project/Fedora/geany/') self.assertEqual(output.status_code, 200) data = json.loads(output.data) del(data['created_on']) del(data['updated_on']) exp = { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": 'DEFAULT', "version": None, "version_url": 'http://www.geany.org/Download/Releases', "versions": [], "packages": [ { "distro": "Fedora", "package_name": "geany" } ], } self.assertEqual(data, exp)
def test_project_all(self): """ Test the all function of Project. """ create_project(self.session) projects = model.Project.all(self.session) self.assertEqual(projects[0].name, 'geany') self.assertEqual(projects[0].homepage, 'http://www.geany.org/') self.assertEqual(projects[1].name, 'R2spec') self.assertEqual( projects[1].homepage, 'https://fedorahosted.org/r2spec/') projects = model.Project.all(self.session, page=3) self.assertEqual(projects, [])
def test_distros(self): """ Test the distros function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/distros/') self.assertEqual(output.status_code, 200) expected = "Here is the list of all the distributions" self.assertTrue(expected in output.data) output = self.app.get('/distros/?page=ab') self.assertEqual(output.status_code, 200) self.assertTrue(expected in output.data)
def test_autocomplete(capfd: Capture, faker: Faker) -> None: create_project( capfd=capfd, name=random_project_name(faker), ) init_project(capfd) app = Application() values = app.autocomplete_service(None, None, "") # type: ignore assert len(values) > 0 assert "backend" in values values = app.autocomplete_service(None, None, "invalid") # type: ignore assert len(values) == 0 values = app.autocomplete_service(None, None, "b") # type: ignore assert len(values) >= 1 assert "backend" in values values = app.autocomplete_allservice(None, None, "") # type: ignore assert len(values) > 0 assert "backend" in values values = app.autocomplete_allservice(None, None, "invalid") # type: ignore assert len(values) == 0 values = app.autocomplete_allservice(None, None, "b") # type: ignore assert len(values) >= 1 assert "backend" in values values = app.autocomplete_allservice(None, None, "c") # type: ignore assert len(values) >= 1 assert "backend" not in values values = app.autocomplete_submodule(None, None, "") # type: ignore assert len(values) > 0 assert "main" in values values = app.autocomplete_submodule(None, None, "invalid") # type: ignore assert len(values) == 0 values = app.autocomplete_submodule(None, None, "m") # type: ignore assert len(values) >= 1 assert "main" in values values = app.autocomplete_submodule(None, None, "d") # type: ignore assert len(values) >= 1 assert "main" not in values os.unlink(".rapydo") values = app.autocomplete_service(None, None, "") # type: ignore assert len(values) == 0 values = app.autocomplete_allservice(None, None, "") # type: ignore assert len(values) == 0 values = app.autocomplete_submodule(None, None, "") # type: ignore assert len(values) == 0
def test_api_get_project_distro(self): """ Test the api_get_project_distro function of the API. """ create_distro(self.session) output = self.app.get('/api/project/Fedora/geany') self.assertEqual(output.status_code, 404) data = _read_json(output) exp = { "error": "No package \"geany\" found in distro \"Fedora\"", "output": "notok" } self.assertEqual(data, exp) create_project(self.session) create_package(self.session) output = self.app.get('/api/project/Fedora/gnome-terminal/') self.assertEqual(output.status_code, 404) data = _read_json(output) exp = { "error": "No package \"gnome-terminal\" found in distro " "\"Fedora\"", "output": "notok" } self.assertEqual(data, exp) output = self.app.get('/api/project/Fedora/geany/') self.assertEqual(output.status_code, 200) data = _read_json(output) del (data['created_on']) del (data['updated_on']) exp = { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": 'DEFAULT', "version": None, "version_url": 'http://www.geany.org/Download/Releases', "versions": [], "packages": [{ "distro": "Fedora", "package_name": "geany" }], } self.assertEqual(data, exp)
def test_cronjobs(capfd: Capture, faker: Faker) -> None: project = random_project_name(faker) create_project( capfd=capfd, name=project, auth="postgres", frontend="no", ) init_project(capfd, "-e CRONTAB_ENABLE=1") start_registry(capfd) pull_images(capfd) start_project(capfd) exec_command(capfd, "status") exec_command( capfd, "logs --tail 50 backend", # Logs are not prefixed because only one service is shown "Found no cronjob to be enabled, skipping crontab setup", "Testing mode", ) with open(f"projects/{project}/backend/cron/hello-world.cron", "w+") as f: f.write("* * * * * echo 'Hello world' >> /var/log/cron.log 2>&1\n") f.write("\n") exec_command( capfd, "-e CRONTAB_ENABLE=1 start --force", "Stack started", ) if Configuration.swarm_mode: time.sleep(10) exec_command( capfd, "logs --tail 50 backend", # Logs are not prefixed because only one service is shown # "Testing mode", "Enabling cron...", "Cron enabled", # this is the output of crontab -l that verifies the cronjob installation "* * * * * echo 'Hello world'", )
def test_api_packages_wiki_list(self): """ Test the api_packages_wiki_list function of the API. """ create_distro(self.session) output = self.app.get('/api/packages/wiki/') self.assertEqual(output.status_code, 200) self.assertEqual(output.data, '') create_project(self.session) create_package(self.session) output = self.app.get('/api/packages/wiki/') self.assertEqual(output.status_code, 200) exp = "* geany DEFAULT http://www.geany.org/Download/Releases\n"\ "* subsurface DEFAULT http://subsurface.hohndel.org/downloads/" self.assertEqual(output.data, exp)
def test_dump(capfd: Capture, faker: Faker) -> None: execute_outside(capfd, "dump") create_project( capfd=capfd, name=random_project_name(faker), auth="postgres", frontend="no", ) init_project(capfd) exec_command( capfd, "dump", "Config dump: docker-compose.yml", )
def test_distro_projects_search(self): """ Test the distro_projects_search function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/distro/Fedora/search/gua') self.assertEqual(output.status_code, 200) expected = """ <blockquote> Oups this is embarrassing, it seems that no projects are being monitored currently. </blockquote>""" self.assertTrue(expected in output.data) self.assertTrue( 'form action="/distro/Fedora/search/" role="form">' in output.data) self.assertTrue('<h1>Search projects in Fedora</h1>' in output.data)
def test_api_packages_wiki_list(self): """ Test the api_packages_wiki_list function of the API. """ create_distro(self.session) output = self.app.get('/api/packages/wiki/') self.assertEqual(output.status_code, 200) self.assertEqual(output.data, b'') create_project(self.session) create_package(self.session) output = self.app.get('/api/packages/wiki/') self.assertEqual(output.status_code, 200) exp = b"* geany DEFAULT http://www.geany.org/Download/Releases\n"\ b"* subsurface DEFAULT http://subsurface.hohndel.org/downloads/" self.assertEqual(output.data, exp)
def test_project(self): """ Test the project function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/project/1/') self.assertEqual(output.status_code, 200) expected = """ <p><a property="doap:homepage" href="http://www.geany.org/" target="_blank">http://www.geany.org/ </a><p>""" self.assertTrue(expected in output.data) output = self.app.get('/project/10/') self.assertEqual(output.status_code, 404)
def test_distro_projects_search(self): """ Test the distro_projects_search function. """ create_distro(self.session) create_project(self.session) output = self.app.get("/distro/Fedora/search/gua") self.assertEqual(output.status_code, 200) expected = b""" <blockquote> Oups this is embarrassing, it seems that no projects are being monitored currently. <p><a href="/project/new?name=gua">Click Here</a> to add this project instead. </p> </blockquote>""" self.assertTrue(expected in output.data) self.assertTrue(b'form action="/distro/Fedora/search/" role="form">' in output.data) self.assertTrue(b"<h1>Search projects in Fedora</h1>" in output.data)
def test_all(capfd: Capture) -> None: exec_command(capfd, "restart", "This command is no longer available") create_project( capfd=capfd, name="first", auth="postgres", frontend="no", ) init_project(capfd) start_registry(capfd) pull_images(capfd) start_project(capfd) start_date1 = get_container_start_date(capfd, "backend") exec_command( capfd, "start", "Stack started", ) start_date2 = get_container_start_date(capfd, "backend") # The service is not restarted because its definition is unchanged assert start_date1 == start_date2 if Configuration.swarm_mode: exec_command( capfd, "remove backend", "first_backend scaled to 0", "verify: Service converged", "Services removed", ) exec_command( capfd, "start --force", "Stack started", ) start_date3 = get_container_start_date(capfd, "backend") assert start_date2 != start_date3
def test_edit_project(self): """ Test the edit_project function of Distro. """ create_distro(self.session) create_project(self.session) project_objs = anitya.lib.model.Project.all(self.session) self.assertEqual(len(project_objs), 3) self.assertEqual(project_objs[0].name, 'geany') self.assertEqual(project_objs[0].homepage, 'http://www.geany.org/') self.assertEqual(project_objs[1].name, 'R2spec') self.assertEqual(project_objs[2].name, 'subsurface') anitya.lib.edit_project( self.session, project=project_objs[0], name=project_objs[0].name, homepage='http://www.geany.org', backend='PyPI', version_url=None, version_prefix=None, regex=None, insecure=False, user_id='*****@*****.**') project_objs = anitya.lib.model.Project.all(self.session) self.assertEqual(len(project_objs), 3) self.assertEqual(project_objs[0].name, 'geany') self.assertEqual(project_objs[0].homepage, 'http://www.geany.org') self.assertEqual(project_objs[1].name, 'R2spec') self.assertEqual(project_objs[2].name, 'subsurface') self.assertRaises( AnityaException, anitya.lib.edit_project, self.session, project=project_objs[2], name='geany', homepage='http://www.geany.org', backend=project_objs[2].backend, version_url=project_objs[2].version_url, version_prefix=None, regex=project_objs[2].regex, insecure=False, user_id='*****@*****.**', )
def test_project_by_homepage(self): """ Test the by_homepage function of Project. """ create_project(self.session) projects = model.Project.by_homepage( self.session, 'http://www.geany.org/') self.assertEqual(len(projects), 1) self.assertEqual(projects[0].name, 'geany') self.assertEqual(projects[0].homepage, 'http://www.geany.org/') projects = model.Project.by_homepage( self.session, 'http://subsurface.hohndel.org/') self.assertEqual(len(projects), 1) self.assertEqual(projects[0].name, 'subsurface') self.assertEqual(projects[0].homepage, 'http://subsurface.hohndel.org/') project = model.Project.by_homepage(self.session, 'terminal') self.assertEqual(project, [])
def test_distros(self): """ Test the distros function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/distros/') self.assertEqual(output.status_code, 200) expected = """ <p> Here is the list of all the distribution having at least one project mapped as a package of this distribution and monitored by anitya. </p>""" self.assertTrue(expected in output.data) output = self.app.get('/distros/?page=ab') self.assertEqual(output.status_code, 200) self.assertTrue(expected in output.data)
def test_api_get_project(self): """ Test the api_get_project function of the API. """ create_distro(self.session) output = self.app.get('/api/project/') self.assertEqual(output.status_code, 404) output = self.app.get('/api/project/10') self.assertEqual(output.status_code, 404) data = _read_json(output) exp = {"error": "no such project", "output": "notok"} self.assertEqual(data, exp) create_project(self.session) create_package(self.session) output = self.app.get('/api/project/10') self.assertEqual(output.status_code, 404) output = self.app.get('/api/project/1') self.assertEqual(output.status_code, 200) data = _read_json(output) del(data['created_on']) del(data['updated_on']) exp = { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": 'DEFAULT', "version": None, "version_url": 'http://www.geany.org/Download/Releases', "versions": [], "packages": [ { "distro": "Fedora", "package_name": "geany" } ], } self.assertEqual(exp, data)
def test_edit_project(self): """ Test the edit_project function of Distro. """ create_distro(self.session) create_project(self.session) project_objs = anitya.lib.model.Project.all(self.session) self.assertEqual(len(project_objs), 3) self.assertEqual(project_objs[0].name, 'geany') self.assertEqual(project_objs[0].homepage, 'http://www.geany.org/') self.assertEqual(project_objs[1].name, 'R2spec') self.assertEqual(project_objs[2].name, 'subsurface') anitya.lib.edit_project(self.session, project=project_objs[0], name=project_objs[0].name, homepage='http://www.geany.org', backend='PyPI', version_url=None, version_prefix=None, regex=None, insecure=False, user_mail='*****@*****.**') project_objs = anitya.lib.model.Project.all(self.session) self.assertEqual(len(project_objs), 3) self.assertEqual(project_objs[0].name, 'geany') self.assertEqual(project_objs[0].homepage, 'http://www.geany.org') self.assertEqual(project_objs[1].name, 'R2spec') self.assertEqual(project_objs[2].name, 'subsurface') self.assertRaises( AnityaException, anitya.lib.edit_project, self.session, project=project_objs[2], name='geany', homepage='http://www.geany.org', backend=project_objs[2].backend, version_url=project_objs[2].version_url, version_prefix=None, regex=project_objs[2].regex, insecure=False, user_mail='*****@*****.**', )
def test_api_get_project(self): """ Test the api_get_project function of the API. """ create_distro(self.session) output = self.app.get('/api/project/') self.assertEqual(output.status_code, 404) output = self.app.get('/api/project/10') self.assertEqual(output.status_code, 404) data = json.loads(output.data) exp = {"error": "no such project", "output": "notok"} self.assertEqual(data, exp) create_project(self.session) create_package(self.session) output = self.app.get('/api/project/10') self.assertEqual(output.status_code, 404) output = self.app.get('/api/project/1') self.assertEqual(output.status_code, 200) data = json.loads(output.data) del (data['created_on']) del (data['updated_on']) exp = { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": 'DEFAULT', "version": None, "version_url": 'http://www.geany.org/Download/Releases', "versions": [], "packages": [{ "distro": "Fedora", "package_name": "geany" }], } self.assertEqual(exp, data)
def test_redis_invalid_characters(capfd: Capture, faker: Faker) -> None: create_project( capfd=capfd, name=random_project_name(faker), auth="no", frontend="no", services=["redis"], extra="--env REDIS_PASSWORD=invalid#password", ) informative = "Some special characters, including #, are not allowed " informative += "because make some clients to fail to connect" exec_command( capfd, "init --force", "Not allowed characters found in REDIS_PASSWORD.", informative, )
def test_project_by_id(self): """ Test the by_id function of Project. """ create_project(self.session) project = model.Project.by_id(self.session, 1) self.assertEqual(project.name, 'geany') self.assertEqual(project.homepage, 'http://www.geany.org/') project = model.Project.get(self.session, 1) self.assertEqual(project.name, 'geany') self.assertEqual(project.homepage, 'http://www.geany.org/') project = model.Project.by_id(self.session, 2) self.assertEqual(project.name, 'subsurface') self.assertEqual(project.homepage, 'http://subsurface.hohndel.org/') project = model.Project.get(self.session, 2) self.assertEqual(project.name, 'subsurface') self.assertEqual(project.homepage, 'http://subsurface.hohndel.org/') project = model.Project.by_id(self.session, 10) self.assertEqual(project, None)
def test_api_projects_names(self): """ Test the api_projects_names function of the API. """ create_distro(self.session) output = self.app.get('/api/projects/names') self.assertEqual(output.status_code, 200) data = json.loads(output.data) exp = {"projects": [], "total": 0} self.assertEqual(data, exp) create_project(self.session) create_package(self.session) output = self.app.get('/api/projects/names/') self.assertEqual(output.status_code, 200) data = json.loads(output.data) exp = { "projects": [ "geany", "R2spec", "subsurface" ], "total": 3 } self.assertEqual(data, exp) output = self.app.get('/api/projects/names/?pattern=ge') self.assertEqual(output.status_code, 200) data = json.loads(output.data) exp = { "projects": [ "geany" ], "total": 1 } self.assertEqual(data, exp)
def test_map_project(self): """ Test the map_project function of Distro. """ create_distro(self.session) create_project(self.session) project_obj = anitya.lib.model.Project.get(self.session, 1) self.assertEqual(project_obj.name, 'geany') self.assertEqual(len(project_obj.packages), 0) # Map `geany` project to CentOS anitya.lib.map_project( self.session, project=project_obj, package_name='geany', distribution='CentOS', user_mail='*****@*****.**', old_package_name=None, ) self.session.commit() project_obj = anitya.lib.model.Project.get(self.session, 1) self.assertEqual(project_obj.name, 'geany') self.assertEqual(len(project_obj.packages), 1) self.assertEqual(project_obj.packages[0].package_name, 'geany') self.assertEqual(project_obj.packages[0].distro, 'CentOS') # Map `geany` project to CentOS, exactly the same way anitya.lib.map_project( self.session, project=project_obj, package_name='geany2', distribution='CentOS', user_mail='*****@*****.**', old_package_name=None, ) self.session.commit() project_obj = anitya.lib.model.Project.get(self.session, 1) self.assertEqual(project_obj.name, 'geany') self.assertEqual(len(project_obj.packages), 2) self.assertEqual(project_obj.packages[0].package_name, 'geany') self.assertEqual(project_obj.packages[0].distro, 'CentOS') self.assertEqual(project_obj.packages[1].package_name, 'geany2') self.assertEqual(project_obj.packages[1].distro, 'CentOS') # Edit the mapping of the `geany` project to Fedora anitya.lib.map_project( self.session, project=project_obj, package_name='geany3', distribution='Fedora', user_mail='*****@*****.**', old_package_name='geany', old_distro_name='CentOS', ) self.session.commit() project_obj = anitya.lib.model.Project.get(self.session, 1) self.assertEqual(project_obj.name, 'geany') self.assertEqual(len(project_obj.packages), 2) pkgs = sorted(project_obj.packages, key=lambda x: x.package_name) self.assertEqual(pkgs[0].package_name, 'geany2') self.assertEqual(pkgs[0].distro, 'CentOS') self.assertEqual(pkgs[1].package_name, 'geany3') self.assertEqual(pkgs[1].distro, 'Fedora') # Edit the mapping of the `geany` project to Fedora project_obj = anitya.lib.model.Project.get(self.session, 2) self.assertEqual(project_obj.name, 'subsurface') self.assertEqual(len(project_obj.packages), 0) self.assertRaises( anitya.lib.exceptions.AnityaException, anitya.lib.map_project, self.session, project=project_obj, package_name='geany2', distribution='CentOS', user_mail='*****@*****.**', )
def test_map_project(self): """ Test the map_project function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/project/1/map', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<li class="errors">Login required</li>' in output.data) projects = model.Project.all(self.session) self.assertEqual(len(projects), 3) self.assertEqual(projects[0].name, 'geany') self.assertEqual(len(projects[0].packages), 0) self.assertEqual(projects[0].id, 1) self.assertEqual(projects[1].name, 'R2spec') self.assertEqual(projects[1].id, 3) self.assertEqual(len(projects[1].packages), 0) self.assertEqual(projects[2].name, 'subsurface') self.assertEqual(projects[2].id, 2) self.assertEqual(len(projects[2].packages), 0) with anitya.app.APP.test_client() as c: with c.session_transaction() as sess: sess['openid'] = 'openid_url' sess['fullname'] = 'Pierre-Yves C.' sess['nickname'] = 'pingou' sess['email'] = '*****@*****.**' output = c.get('/project/10/map', follow_redirects=True) self.assertEqual(output.status_code, 404) output = c.get('/project/1/map', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('<h1>Project: geany</h1>' in output.data) self.assertTrue( '<td><label for="distro">Distribution</label></td>' in output.data) data = { 'package_name': 'geany', 'distro': 'CentOS', } output = c.post( '/project/1/map', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('<h1>Project: geany</h1>' in output.data) self.assertTrue( '<td><label for="distro">Distribution</label></td>' in output.data) # This should works just fine csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data['csrf_token'] = csrf_token output = c.post( '/project/1/map', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<li class="message">Mapping added</li>' in output.data) self.assertTrue( '<h1>Project: geany</h1>' in output.data) # This should fail, the mapping already exists data = { 'package_name': 'geany', 'distro': 'CentOS', 'csrf_token': csrf_token, } output = c.post( '/project/1/map', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<li class="error">Could not edit the mapping of geany on ' 'CentOS, there is already a package geany on CentOS.</li>' in output.data) self.assertTrue( '<h1>Project: geany</h1>' in output.data) projects = model.Project.all(self.session) self.assertEqual(len(projects), 3) self.assertEqual(projects[0].name, 'geany') self.assertEqual(projects[0].id, 1) self.assertEqual(len(projects[0].packages), 1) self.assertEqual(projects[0].packages[0].package_name, 'geany') self.assertEqual(projects[1].name, 'R2spec') self.assertEqual(projects[1].id, 3) self.assertEqual(len(projects[1].packages), 0) self.assertEqual(projects[2].name, 'subsurface') self.assertEqual(projects[2].id, 2) self.assertEqual(len(projects[2].packages), 0)
def test_edit_project(self): """ Test the edit_project function. """ create_distro(self.session) create_project(self.session) output = self.app.get('/project/1/edit', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<li class="errors">Login required</li>' in output.data) projects = model.Project.all(self.session) self.assertEqual(len(projects), 3) self.assertEqual(projects[0].name, 'geany') self.assertEqual(projects[0].id, 1) self.assertEqual(projects[1].name, 'R2spec') self.assertEqual(projects[1].id, 3) self.assertEqual(projects[2].name, 'subsurface') self.assertEqual(projects[2].id, 2) with anitya.app.APP.test_client() as c: with c.session_transaction() as sess: sess['openid'] = 'openid_url' sess['fullname'] = 'Pierre-Yves C.' sess['nickname'] = 'pingou' sess['email'] = '*****@*****.**' output = c.get('/project/10/edit', follow_redirects=True) self.assertEqual(output.status_code, 404) output = c.get('/project/1/edit', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('<h1>Edit project</h1>' in output.data) self.assertTrue( '<td><label for="regex">Regex</label></td>' in output.data) data = { 'name': 'repo_manager', 'homepage': 'https://pypi.python.org/pypi/repo_manager', 'backend': 'pypi', } output = c.post( '/project/1/edit', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('<h1>Edit project</h1>' in output.data) self.assertTrue( '<td><label for="regex">Regex</label></td>' in output.data) # This should works just fine csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data['csrf_token'] = csrf_token output = c.post( '/project/1/edit', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<li class="message">Project edited</li>' in output.data) self.assertTrue( '<h1>Project: repo_manager</h1>' in output.data) # This should fail, the R2spec project already exists data = { 'name': 'R2spec', 'homepage': 'https://fedorahosted.org/r2spec/', 'backend': 'folder', 'csrf_token': csrf_token, } output = c.post( '/project/1/edit', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<li class="errors">Could not edit this project. Is there ' 'already a project with these name and homepage?</li>' in output.data) self.assertTrue( '<h1>Project: repo_manager</h1>' in output.data) projects = model.Project.all(self.session) self.assertEqual(len(projects), 3) self.assertEqual(projects[0].name, 'R2spec') self.assertEqual(projects[0].id, 3) self.assertEqual(projects[1].name, 'repo_manager') self.assertEqual(projects[1].id, 1) self.assertEqual(projects[2].name, 'subsurface') self.assertEqual(projects[2].id, 2)
def test_api_get_version(self): """ Test the api_get_version function of the API. """ create_distro(self.session) output = self.app.post('/api/version/get') self.assertEqual(output.status_code, 400) data = json.loads(output.data) exp = {"error": ["No project id specified"], "output": "notok"} self.assertEqual(data, exp) create_project(self.session) create_package(self.session) data = {'id': 10} output = self.app.post('/api/version/get', data=data) self.assertEqual(output.status_code, 404) data = json.loads(output.data) exp = {"error": "No such project", "output": "notok"} self.assertEqual(data, exp) # Modify the project so that it fails project = model.Project.get(self.session, 1) project.version_url = "http://www.geany.org/Down" self.session.add(project) self.session.commit() data = {'id': 1} output = self.app.post('/api/version/get', data=data) self.assertEqual(output.status_code, 400) data = json.loads(output.data) exp = { "error": [ "geany: no upstream version found. " "- http://www.geany.org/Down - " " " + REGEX % ({'name': 'geany'}) ], "output": "notok" } # This test will break for every update of geany, so we need to # keep the output easy on hand. #print output.data self.assertEqual(data, exp) # Modify it back: project.version_url = "http://www.geany.org/Download/Releases" self.session.add(project) self.session.commit() data = {'id': 1} output = self.app.post('/api/version/get', data=data) self.assertEqual(output.status_code, 200) data = json.loads(output.data) del(data['created_on']) del(data['updated_on']) exp = { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": "DEFAULT", "version": "1.24.1", "version_url": "http://www.geany.org/Download/Releases", "versions": ["1.24.1"], "packages": [ { "distro": "Fedora", "package_name": "geany" } ], } # This test will break for every update of geany, so we need to # keep the output easy on hand. #print output.data self.assertEqual(data, exp)
def test_api_projects(self): """ Test the api_projects function of the API. """ create_distro(self.session) output = self.app.get('/api/projects') self.assertEqual(output.status_code, 200) data = json.loads(output.data) exp = {"projects": [], "total": 0} self.assertEqual(data, exp) create_project(self.session) output = self.app.get('/api/projects/') self.assertEqual(output.status_code, 200) data = json.loads(output.data) for key in range(len(data['projects'])): del(data['projects'][key]['created_on']) del(data['projects'][key]['updated_on']) exp = { "projects": [ { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": "DEFAULT", "version": None, "version_url": "http://www.geany.org/Download/Releases", "versions": [] }, { "id": 3, "backend": "custom", "homepage": "https://fedorahosted.org/r2spec/", "name": "R2spec", "regex": None, "version": None, "version_url": None, "versions": [] }, { "id": 2, "backend": "custom", "homepage": "http://subsurface.hohndel.org/", "name": "subsurface", "regex": "DEFAULT", "version": None, "version_url": "http://subsurface.hohndel.org/downloads/", "versions": [] } ], "total": 3 } self.assertEqual(data, exp) output = self.app.get('/api/projects/?pattern=ge') self.assertEqual(output.status_code, 200) data = json.loads(output.data) for key in range(len(data['projects'])): del(data['projects'][key]['created_on']) del(data['projects'][key]['updated_on']) exp = { "projects": [ { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": "DEFAULT", "version": None, "version_url": "http://www.geany.org/Download/Releases", "versions": [], }, ], "total": 1 } self.assertEqual(data, exp) output = self.app.get('/api/projects/?homepage=http://www.geany.org/') self.assertEqual(output.status_code, 200) data = json.loads(output.data) for key in range(len(data['projects'])): del(data['projects'][key]['created_on']) del(data['projects'][key]['updated_on']) exp = { "projects": [ { "id": 1, "backend": "custom", "homepage": "http://www.geany.org/", "name": "geany", "regex": "DEFAULT", "version": None, "version_url": "http://www.geany.org/Download/Releases", "versions": [], }, ], "total": 1 } self.assertEqual(data, exp) output = self.app.get('/api/projects/?pattern=foo&homepage=bar') self.assertEqual(output.status_code, 400)
def test_delete_project_mapping(self): """ Test the delete_project_mapping function. """ create_distro(self.session) create_project(self.session) create_package(self.session) output = self.app.get( '/project/1/delete/Fedora/geany', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<li class="errors">Login required</li>' in output.data) with anitya.app.APP.test_client() as c: with c.session_transaction() as sess: sess['openid'] = 'openid_url' sess['fullname'] = 'Pierre-Yves C.' sess['nickname'] = 'pingou' sess['email'] = '*****@*****.**' output = c.get( '/project/100/delete/Fedora/geany', follow_redirects=True) self.assertEqual(output.status_code, 404) output = c.get( '/project/1/delete/CentOS/geany', follow_redirects=True) self.assertEqual(output.status_code, 404) output = c.get( '/project/1/delete/Fedora/geany2', follow_redirects=True) self.assertEqual(output.status_code, 404) output = c.get( '/project/1/delete/Fedora/geany', follow_redirects=True) self.assertEqual(output.status_code, 401) output = c.get('/project/1/') self.assertEqual(output.status_code, 200) self.assertTrue('<h1>Project: geany</h1>' in output.data) self.assertTrue('<td>Fedora</td>' in output.data) with anitya.app.APP.test_client() as c: with c.session_transaction() as sess: sess['openid'] = 'http://pingou.id.fedoraproject.org/' sess['fullname'] = 'Pierre-Yves C.' sess['nickname'] = 'pingou' sess['email'] = '*****@*****.**' output = c.get('/project/1/delete/Fedora/geany', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<h1>Project: geany - Delete package</h1>' in output.data) self.assertTrue( '<button type="submit" name="confirm" value="Yes"' in output.data) data = { 'confirm': 'Yes', } output = c.post( '/project/1/delete/Fedora/geany', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '<h1>Project: geany - Delete package</h1>' in output.data) self.assertTrue( '<button type="submit" name="confirm" value="Yes"' in output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data['csrf_token'] = csrf_token del(data['confirm']) output = c.post( '/project/1/delete/Fedora/geany', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('<h1>Project: geany</h1>' in output.data) self.assertTrue('<td>Fedora</td>' in output.data) data['confirm'] = True output = c.post( '/project/1/delete/Fedora/geany', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( 'class="message">Mapping for geany has been removed</li>' in output.data) self.assertTrue('<h1>Project: geany</h1>' in output.data) self.assertFalse('<td>Fedora</td>' in output.data)