forked from beba/foerderbarometer
				
			added basic tests for extern view
This commit is contained in:
		
							parent
							
								
									233151968b
								
							
						
					
					
						commit
						e5cea49673
					
				| 
						 | 
					@ -8,6 +8,9 @@ from django.http import HttpResponse
 | 
				
			||||||
from input.forms import LibraryForm
 | 
					from input.forms import LibraryForm
 | 
				
			||||||
from input.models import HonoraryCertificate, Project, Account, Literature
 | 
					from input.models import HonoraryCertificate, Project, Account, Literature
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .views import ViewTestCase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestWithoutLogin(TestCase):
 | 
					class TestWithoutLogin(TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					from django.test import TestCase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from input.utils.testing import request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ViewTestCase(TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_index(self):
 | 
				
			||||||
 | 
					        request(self, 'index')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_extern(self):
 | 
				
			||||||
 | 
					        request(self, 'extern')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_extern_travel(self):
 | 
				
			||||||
 | 
					        data = {
 | 
				
			||||||
 | 
					            'extern_view-current_step': 0,
 | 
				
			||||||
 | 
					            '0-realname': 'Test',
 | 
				
			||||||
 | 
					            '0-email': 'test@example.com',
 | 
				
			||||||
 | 
					            '0-choice': 'TRAV',
 | 
				
			||||||
 | 
					            '0-check': True,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = request(self, 'extern', data=data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertContains(response, 'Transportmittel')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        data = {
 | 
				
			||||||
 | 
					            'extern_view-current_step': 1,
 | 
				
			||||||
 | 
					            'project_name': 'Test',
 | 
				
			||||||
 | 
					            'transport': 'BAHN',
 | 
				
			||||||
 | 
					            'travelcost': 10,
 | 
				
			||||||
 | 
					            'checkin': '2025-01-01',
 | 
				
			||||||
 | 
					            'checkout': '2025-01-02',
 | 
				
			||||||
 | 
					            'hotel': 'TRUE',
 | 
				
			||||||
 | 
					            'notes': '',
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = request(self, 'extern', data=data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertContains(response, 'Deine Anfrage wurde gesendet.')
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,114 @@
 | 
				
			||||||
 | 
					from typing import Any, Iterable, Mapping, Union, Tuple, Protocol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.http import HttpRequest, HttpResponse
 | 
				
			||||||
 | 
					from django.http.response import HttpResponseRedirectBase, StreamingHttpResponse
 | 
				
			||||||
 | 
					from django.shortcuts import resolve_url
 | 
				
			||||||
 | 
					from django.template import Context
 | 
				
			||||||
 | 
					from django.template.response import TemplateResponse
 | 
				
			||||||
 | 
					from django.test import Client, SimpleTestCase
 | 
				
			||||||
 | 
					from django.urls import reverse, ResolverMatch
 | 
				
			||||||
 | 
					from django.utils.http import urlencode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FormData = dict
 | 
				
			||||||
 | 
					JSONDict = dict
 | 
				
			||||||
 | 
					JSONList = list
 | 
				
			||||||
 | 
					RequestData = Union[FormData, JSONDict, JSONList]
 | 
				
			||||||
 | 
					QueryParams = Union[Mapping[str, Any], Iterable[Tuple[str, Any]]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestClientResponse(Protocol):
 | 
				
			||||||
 | 
					    client: Client
 | 
				
			||||||
 | 
					    request: HttpRequest
 | 
				
			||||||
 | 
					    templates: list
 | 
				
			||||||
 | 
					    context: Context
 | 
				
			||||||
 | 
					    resolver_match: ResolverMatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def json(self) -> Union[JSONList, JSONDict]: ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Response = Union[
 | 
				
			||||||
 | 
					    HttpResponse,
 | 
				
			||||||
 | 
					    HttpResponseRedirectBase,
 | 
				
			||||||
 | 
					    StreamingHttpResponse,
 | 
				
			||||||
 | 
					    TemplateResponse,
 | 
				
			||||||
 | 
					    TestClientResponse,
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ObjectWithGetAbsoluteURLMethod(Protocol):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_absolute_url(self) -> str: ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					URL = Union[str, ObjectWithGetAbsoluteURLMethod]
 | 
				
			||||||
 | 
					URLArgs = Union[tuple, list]
 | 
				
			||||||
 | 
					URLKwargs = dict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_url(url: URL, args: URLArgs = None, kwargs: URLKwargs = None) -> str:
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Helper to reverse the given url name.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if args or kwargs:
 | 
				
			||||||
 | 
					        return reverse(url, args=args, kwargs=kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return resolve_url(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_handler(test_case: SimpleTestCase, method: str = None, data=None):
 | 
				
			||||||
 | 
					    if data:
 | 
				
			||||||
 | 
					        method = str.lower(method or 'POST')
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        method = str.lower(method or 'GET')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return getattr(test_case.client, method)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def request(
 | 
				
			||||||
 | 
					    test_case: SimpleTestCase,
 | 
				
			||||||
 | 
					    url: URL,
 | 
				
			||||||
 | 
					    status_code: int = None,
 | 
				
			||||||
 | 
					    expected_url: URL = None,
 | 
				
			||||||
 | 
					    args: URLArgs = None,
 | 
				
			||||||
 | 
					    kwargs: URLKwargs = None,
 | 
				
			||||||
 | 
					    headers: dict = None,
 | 
				
			||||||
 | 
					    msg: str = None,
 | 
				
			||||||
 | 
					    query_params: QueryParams = None,
 | 
				
			||||||
 | 
					    method: str = None,
 | 
				
			||||||
 | 
					    data: RequestData = None,
 | 
				
			||||||
 | 
					    **options,
 | 
				
			||||||
 | 
					) -> Response:
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    A helper to make a request with the test case's http client.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The given args and kwargs are used to reverse the url
 | 
				
			||||||
 | 
					    but not the expected url. When expected url needs
 | 
				
			||||||
 | 
					    args/kwargs pass an absolute url instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    All additional kwargs are passed as post parameters.
 | 
				
			||||||
 | 
					    When posting without parameters just pass post=True.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    data = data or options or None
 | 
				
			||||||
 | 
					    handler = get_handler(test_case, method, data)
 | 
				
			||||||
 | 
					    url = get_url(url, args, kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if query_params:
 | 
				
			||||||
 | 
					        url = f'{url}?%s' % urlencode(query_params, doseq=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    headers = headers or {}
 | 
				
			||||||
 | 
					    status_code = status_code or 200
 | 
				
			||||||
 | 
					    response = handler(url, data=data, **headers)
 | 
				
			||||||
 | 
					    msg = msg or getattr(response, 'content', None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if expected_url:
 | 
				
			||||||
 | 
					        test_case.assertRedirects(
 | 
				
			||||||
 | 
					            response=response,
 | 
				
			||||||
 | 
					            expected_url=get_url(expected_url),
 | 
				
			||||||
 | 
					            target_status_code=status_code,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        test_case.assertEqual(response.status_code, status_code, msg=msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return response
 | 
				
			||||||
		Loading…
	
		Reference in New Issue