forked from CGM_Public/pretix_original
307 lines
8.7 KiB
Python
307 lines
8.7 KiB
Python
from pretix.plugins.wallet.styles.base import (
|
|
PassStyle,
|
|
PredefinedFieldGroup,
|
|
WalletPlatform,
|
|
PlaceholderFieldGroup,
|
|
FieldContentType,
|
|
FieldGroupType,
|
|
FieldEntryType,
|
|
FieldGroupDisplay
|
|
)
|
|
from django.utils.translation import gettext as _
|
|
import jsonschema
|
|
import pytest
|
|
from i18nfield.strings import LazyI18nString
|
|
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
from cryptography.hazmat.primitives import serialization, hashes
|
|
from cryptography import x509
|
|
import datetime
|
|
import io
|
|
import zipfile
|
|
import json
|
|
|
|
|
|
class WalletTestPlatform(WalletPlatform):
|
|
identifier = "test_platform"
|
|
name = _("Test Wallet Platform")
|
|
|
|
|
|
class MinimalTestStyle(PassStyle):
|
|
platform = WalletTestPlatform
|
|
identifier = "test_style"
|
|
name = _("Test Wallet Style")
|
|
fieldgroups = []
|
|
|
|
|
|
class TicketTestStyle(PassStyle):
|
|
platform = WalletTestPlatform
|
|
identifier = "test_ticket"
|
|
name = _("Test Wallet Style Ticket")
|
|
fieldgroups = [
|
|
PlaceholderFieldGroup(
|
|
identifier="text1",
|
|
name=_("Text 1"),
|
|
content_type=FieldContentType.TEXT,
|
|
required=True,
|
|
),
|
|
PlaceholderFieldGroup(
|
|
identifier="text2",
|
|
name=_("Text 2"),
|
|
content_type=FieldContentType.TEXT,
|
|
required=False,
|
|
display=FieldGroupDisplay.PLAIN,
|
|
),
|
|
PlaceholderFieldGroup(
|
|
identifier="image1",
|
|
name=_("Image 1"),
|
|
content_type=FieldContentType.IMAGE,
|
|
required=False,
|
|
display=FieldGroupDisplay.PLAIN,
|
|
),
|
|
]
|
|
|
|
def generate(self, op):
|
|
fields = self.get_pass_fields({})
|
|
return fields
|
|
|
|
|
|
@pytest.fixture
|
|
def layout_context():
|
|
return {
|
|
"placeholders": {
|
|
"text": {"test_placeholder": {"evaluate": lambda: "test placeholder"}}
|
|
}
|
|
}
|
|
|
|
|
|
def test_schema_generation_minimal():
|
|
style = MinimalTestStyle
|
|
context = {}
|
|
schema = style.layout_schema(context)
|
|
assert isinstance(schema, dict)
|
|
assert "properties" in schema
|
|
assert "fieldgroups" in schema["properties"]
|
|
|
|
jsonschema.validate({}, schema)
|
|
jsonschema.validate({"fieldgroups": {}}, schema)
|
|
|
|
|
|
def test_schema_ticket_generation(layout_context):
|
|
style = TicketTestStyle
|
|
schema = style.layout_schema(layout_context)
|
|
assert isinstance(schema, dict)
|
|
assert "properties" in schema
|
|
assert "fieldgroups" in schema["properties"]
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"layout",
|
|
[
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": "test",
|
|
"content": "test_placeholder",
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": {"de": "test-de", "en": "test-en"},
|
|
"content": "test_placeholder",
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{"type": "text", "label": "test", "content": "test content"}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": {"de": "test-de", "en": "test-en"},
|
|
"content": "test_placeholder",
|
|
},
|
|
{"type": "text", "label": "test", "content": "test content"},
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": {"de": "test-de", "en": "test-en"},
|
|
"content": "test_placeholder",
|
|
},
|
|
{"type": "text", "label": "test", "content": "test content"},
|
|
],
|
|
"overflow": "text2",
|
|
}
|
|
}
|
|
},
|
|
],
|
|
)
|
|
def test_schema_ticket_valid(layout_context, layout):
|
|
style = TicketTestStyle
|
|
schema = style.layout_schema(layout_context)
|
|
|
|
jsonschema.validate(layout, schema)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"layout",
|
|
[
|
|
{},
|
|
{"fieldgroups": {}},
|
|
{"fieldgroups": {"text1": {}}},
|
|
{"fieldgroups": {"text1": {"entries": []}}},
|
|
{"fieldgroups": {"text1": {"overflow": "test"}}},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [{"type": "placeholder", "content": "test_placeholder"}]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": [],
|
|
"content": "test_placeholder",
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {"entries": [{"type": "text", "content": "test content"}]}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": "test",
|
|
"content": "test_placeholder",
|
|
}
|
|
],
|
|
"overflow": "invalid_group",
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": "test",
|
|
"content": "test_placeholder",
|
|
}
|
|
],
|
|
"overflow": "image1",
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": "test",
|
|
"content": "test_placeholder",
|
|
}
|
|
],
|
|
},
|
|
"text2": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": "test",
|
|
"content": "test_placeholder",
|
|
}
|
|
],
|
|
"overflow": "text1",
|
|
},
|
|
}
|
|
},
|
|
],
|
|
)
|
|
def test_schema_ticket_invalid(layout_context, layout):
|
|
style = TicketTestStyle
|
|
schema = style.layout_schema(layout_context)
|
|
|
|
with pytest.raises(jsonschema.ValidationError):
|
|
jsonschema.validate(layout, schema)
|
|
|
|
|
|
def test_style_representation():
|
|
style = TicketTestStyle
|
|
style_dict = style.asdict()
|
|
assert style_dict["platform"] == "test_platform"
|
|
assert style_dict["identifier"] == "test_ticket"
|
|
assert style_dict["name"] == _("Test Wallet Style Ticket")
|
|
|
|
assert style_dict["fieldgroups"][0]["identifier"] == "text1"
|
|
assert style_dict["fieldgroups"][0]["name"] == "Text 1"
|
|
assert style_dict["fieldgroups"][0]["content_type"] == "text"
|
|
assert style_dict["fieldgroups"][0]["labels"] == True
|
|
assert style_dict["fieldgroups"][0]["required"] == True
|
|
|
|
|
|
def test_layout_generate(layout_context):
|
|
style = TicketTestStyle
|
|
layout = {
|
|
"fieldgroups": {
|
|
"text1": {
|
|
"entries": [
|
|
{
|
|
"type": "placeholder",
|
|
"label": {"de": "test-de", "en": "test-en"},
|
|
"content": "test_placeholder",
|
|
},
|
|
{"type": "text", "label": "test", "content": "test content"},
|
|
],
|
|
"overflow": "text2",
|
|
}
|
|
}
|
|
}
|
|
# TODO: create event and pass here
|
|
pass_layout = style(event=None, layout=layout)
|
|
generated_pass = pass_layout.generate(layout_context)
|
|
|
|
assert (
|
|
generated_pass
|
|
== "Generated Pass: Test Wallet Style Ticket\n\nGroup: Text 1\ntest-en: test placeholder\ntest: test content\n\n"
|
|
)
|
|
|