fdroid-repomaker/repomaker/tests/test_urls.py

90 lines
3.6 KiB
Python

from django.contrib.auth.models import User
from django.urls import reverse
import repomaker.storage
from repomaker.models import Repository, RemoteRepository, App, Category, Screenshot, Apk, \
ApkPointer, GitStorage
from repomaker.tests import RmTestCase
from repomaker.urls import urlpatterns
IGNORE = ['js_reverse', 'javascript-catalog']
class UrlsTest(RmTestCase):
test_user = None
test_repo = None
remote_repo = None
category = None
app = None
screenshot = None
apk = None
apk_pointer = None
storage = None
def setUp(self):
super().setUp()
self.test_user = User.objects.create(username="testuser")
self.test_repo = Repository.objects.create(
name="Test Repo",
description="This repo belongs to testuser, but another user is logged in.",
url="https://example.org",
user=self.test_user,
)
self.remote_repo = RemoteRepository.objects.get(pk=1)
self.remote_repo.users.set([self.test_user])
self.remote_repo.save()
self.category = Category.objects.create(user=self.test_user, name="TestCat")
self.app = App.objects.create(repo=self.test_repo, package_id='org.example', name="App")
self.screenshot = Screenshot.objects.create(app=self.app)
self.apk = Apk.objects.create(package_id='org.example')
self.apk_pointer = ApkPointer.objects.create(apk=self.apk, repo=self.test_repo,
app=self.app)
self.storage = GitStorage.objects.create(repo=self.test_repo)
def test_authentication(self):
for url in urlpatterns:
if not hasattr(url, 'name'):
continue
if url.name in IGNORE:
continue
keys = url.pattern.regex.groupindex.keys()
params = {}
expectation = 403
# Set URL parameters
if 'repo_id' in keys:
params['repo_id'] = self.test_repo.pk
if 'remote_repo_id' in keys:
params['remote_repo_id'] = self.remote_repo.pk
if 'lang' in keys:
params['lang'] = 'en-US'
if 'category_id' in keys:
params['category_id'] = self.category.pk
if 'app_id' in keys:
params['app_id'] = self.app.pk
if 's_id' in keys:
params['s_id'] = self.screenshot.pk
if 'pk' in keys:
params['pk'] = self.apk_pointer.pk
if 'path' in keys:
params['path'] = repomaker.storage.get_repo_root_path(self.test_repo)
# Adapt HTTP status code expectations different from 403 Forbidden
if 'index' == url.name:
expectation = 200 # showing an index is always possible
elif 'add_repo' == url.name or 'add_remote_repo' == url.name:
expectation = 200 # adding a new (remote) repo is always possible
elif 'app' == url.name or 'app_edit' == url.name:
# expectation = 404 # apps are bound to repo and return 404 when not found there
# XXX unless I'm reading this wrong, it's requesting an app that is in the repo,
# so it shouldn't 404?
expectation = 403
resolved_url = reverse(url.name, kwargs=params)
print("%(url)s should return %(status_code)d" % {'url': resolved_url,
'status_code': expectation})
response = self.client.get(resolved_url)
self.assertEqual(expectation, response.status_code)