191 lines
8.7 KiB
Python
191 lines
8.7 KiB
Python
from unittest.mock import patch
|
|
|
|
import lxml.html
|
|
import django.http
|
|
import django.urls
|
|
from django.conf import settings
|
|
from django.contrib.auth.models import User
|
|
from django.urls import reverse
|
|
from django.utils import translation
|
|
from repomaker.models import RemoteRepository, RemoteApp, RemoteScreenshot, \
|
|
RemoteApkPointer
|
|
|
|
from .. import RmTestCase
|
|
|
|
|
|
class RemoteRepositoryViewTest(RmTestCase):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.remote_repo = RemoteRepository.objects.get(pk=1)
|
|
|
|
# Add remote repo to all multi-user mode users
|
|
if not settings.SINGLE_USER_MODE:
|
|
self.remote_repo.users.set(User.objects.all())
|
|
|
|
self.app = RemoteApp.objects.create(repo=self.remote_repo, package_id='org.example',
|
|
last_updated_date=self.remote_repo.last_updated_date,
|
|
name='App')
|
|
self.app.translate('en-us')
|
|
with translation.override('en-us'):
|
|
self.app.summary = 'Test Summary'
|
|
self.app.description = 'Test Description'
|
|
self.app.save()
|
|
|
|
# Add second app only available in German
|
|
self.app2 = RemoteApp.objects.create(repo=self.remote_repo, package_id='org.example2',
|
|
last_updated_date=self.remote_repo.last_updated_date,
|
|
name='App2')
|
|
self.app2.translate('de')
|
|
with translation.override('de'):
|
|
self.app2.summary = 'Test Zusammenfassung'
|
|
self.app2.description = 'Test Beschreibung'
|
|
self.app2.save()
|
|
|
|
# add a remote screenshot
|
|
self.screenshot = RemoteScreenshot.objects.create(app=self.app, url='test-url',
|
|
language_code='en-us')
|
|
|
|
def test_list_app_translation(self):
|
|
# Request repo app list page and ensure all localized descriptions are shown
|
|
response = self.client.get(reverse('add_app', kwargs={'repo_id': self.repo.id}))
|
|
self.assertContains(response, self.app.summary)
|
|
self.assertContains(response, self.app.description)
|
|
self.assertContains(response, self.app2.description)
|
|
self.assertContains(response, self.app2.description)
|
|
|
|
def test_list_app_ajax_translation(self):
|
|
# Request repo app list page via json and ensure all localized descriptions are included
|
|
response = self.client.get(reverse('add_app', kwargs={'repo_id': self.repo.id}),
|
|
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
|
|
self.assertTrue(isinstance(response, django.http.JsonResponse))
|
|
json = '[' \
|
|
'{ "categories": [], "description": "Test Description", "repo_id": 1,' \
|
|
' "lang": "en-us", "id": 1, "summary": "Test Summary",' \
|
|
' "icon": "/static/repomaker/images/default-app-icon.png", "added": false,' \
|
|
' "name": "App"},' \
|
|
'{ "categories": [], "description": "Test Beschreibung", "repo_id": 1,' \
|
|
' "lang": "de", "id": 2, "summary": "Test Zusammenfassung",' \
|
|
' "icon": "/static/repomaker/images/default-app-icon.png", "added": false,' \
|
|
' "name": "App2"}' \
|
|
']'
|
|
self.assertJSONEqual(response.content.decode(), json)
|
|
|
|
def test_list_app_clear_filter_not_visible_when_no_active_filter(self):
|
|
response = self.client.get(reverse('add_app', kwargs={'repo_id': self.repo.id}))
|
|
html = lxml.html.fromstring(response.content)
|
|
elements = html.cssselect('.rm-app-clear-filters')
|
|
|
|
self.assertEqual(0, len(elements), 'clear filter link should not be here')
|
|
|
|
def test_list_app_clear_filter_visible_when_remote_repo_filter_active(self):
|
|
response = self.client.get(reverse('add_app', kwargs={
|
|
'repo_id': self.repo.id,
|
|
'remote_repo_id': self.remote_repo.id,
|
|
}))
|
|
|
|
html = lxml.html.fromstring(response.content)
|
|
elements = html.cssselect('.rm-app-clear-filters a')
|
|
expectedUrl = reverse('add_app', kwargs={'repo_id': self.repo.id})
|
|
|
|
self.assertEqual(1, len(elements), 'clear filter link must be here')
|
|
self.assertEqual(expectedUrl, elements[0].attrib['href'])
|
|
|
|
def test_list_app_clear_filter_visible_when_category_filter_active(self):
|
|
response = self.client.get(reverse('add_app_with_category', kwargs={
|
|
'repo_id': self.repo.id,
|
|
'category_id': 1,
|
|
}))
|
|
|
|
html = lxml.html.fromstring(response.content)
|
|
elements = html.cssselect('.rm-app-clear-filters a')
|
|
expectedUrl = reverse('add_app', kwargs={'repo_id': self.repo.id})
|
|
|
|
self.assertEqual(1, len(elements), 'clear filter link must be here')
|
|
self.assertEqual(expectedUrl, elements[0].attrib['href'])
|
|
|
|
def test_list_app_clear_filter_visible_when_both_remote_repo_and_category_filters_active(self):
|
|
response = self.client.get(reverse('add_app_with_category', kwargs={
|
|
'repo_id': self.repo.id,
|
|
'remote_repo_id': self.remote_repo.id,
|
|
'category_id': 1,
|
|
}))
|
|
|
|
html = lxml.html.fromstring(response.content)
|
|
elements = html.cssselect('.rm-app-clear-filters a')
|
|
expectedUrl = reverse('add_app', kwargs={'repo_id': self.repo.id})
|
|
|
|
self.assertEqual(1, len(elements), 'clear filter link must be here')
|
|
self.assertEqual(expectedUrl, elements[0].attrib['href'])
|
|
|
|
def test_remote_app_details(self):
|
|
# request remote app detail page
|
|
kwargs = {'repo_id': self.repo.id, 'remote_repo_id': self.remote_repo.id,
|
|
'app_id': self.app.id, 'lang': 'en-us'}
|
|
response = self.client.get(reverse('add_remote_app', kwargs=kwargs))
|
|
|
|
# assert that localized metadata is shown on the page
|
|
self.assertContains(response, self.app.summary)
|
|
self.assertContains(response, self.app.description)
|
|
|
|
# assert that link to show screenshots is shown
|
|
self.assertContains(response, reverse('add_remote_app_screenshots', kwargs=kwargs))
|
|
|
|
def test_remote_app_details_screenshot(self):
|
|
# request remote app detail page
|
|
kwargs = {'repo_id': self.repo.id, 'remote_repo_id': self.remote_repo.id,
|
|
'app_id': self.app.id, 'lang': 'en-us'}
|
|
response = self.client.get(reverse('add_remote_app_screenshots', kwargs=kwargs))
|
|
|
|
# assert that localized metadata is shown on the page
|
|
self.assertContains(response, self.app.summary)
|
|
self.assertContains(response, self.app.description)
|
|
|
|
# assert that screenshot is shown
|
|
self.assertContains(response, 'src="'+self.screenshot.url)
|
|
|
|
def test_remote_app_details_unknown_lang(self):
|
|
kwargs = {'repo_id': self.repo.id, 'remote_repo_id': self.remote_repo.id,
|
|
'app_id': self.app.id, 'lang': 'xxx'}
|
|
response = self.client.get(reverse('add_remote_app', kwargs=kwargs))
|
|
self.assertEqual(404, response.status_code)
|
|
|
|
def test_remote_app_details_lang_switch(self):
|
|
# translate app to German
|
|
self.app.translate('de')
|
|
self.app.save()
|
|
|
|
# request remote app detail page
|
|
kwargs = {'repo_id': self.repo.id, 'remote_repo_id': self.remote_repo.id,
|
|
'app_id': self.app.id, 'lang': 'de'}
|
|
response = self.client.get(reverse('add_remote_app', kwargs=kwargs))
|
|
|
|
# assert that link to both languages is shown on the page
|
|
kwargs['lang'] = 'en-us'
|
|
self.assertContains(response, 'href="' + reverse('add_remote_app', kwargs=kwargs))
|
|
kwargs['lang'] = 'de'
|
|
self.assertContains(response, 'href="' + reverse('add_remote_app', kwargs=kwargs))
|
|
|
|
# request German page and assert that localized metadata is shown on the page
|
|
response = self.client.get(reverse('add_remote_app', kwargs=kwargs))
|
|
self.assertContains(response, self.app.summary)
|
|
self.assertContains(response, self.app.description)
|
|
|
|
@patch('repomaker.models.remoteapp.RemoteApp.add_to_repo')
|
|
def test_remote_app_details_add_no_js(self, add_to_repo):
|
|
# one remote APK pointer is required for apps to be added
|
|
RemoteApkPointer.objects.create(app=self.app)
|
|
|
|
add_to_repo.return_value.get_absolute_url = lambda: 'test-url'
|
|
|
|
# request remote app detail page
|
|
kwargs = {'repo_id': self.repo.id, 'remote_repo_id': self.remote_repo.id,
|
|
'app_id': self.app.id, 'lang': 'en-us'}
|
|
response = self.client.post(reverse('add_remote_app', kwargs=kwargs))
|
|
|
|
# ensure that app was added and we are redirected to proper page
|
|
add_to_repo.assert_called_once_with(self.repo)
|
|
self.assertTrue(isinstance(response, django.http.HttpResponseRedirect))
|
|
self.assertEqual('test-url', response.url)
|