Skip to content

Commit

Permalink
Merge pull request #83 from reiterl/dev1
Browse files Browse the repository at this point in the history
Add motion_category action set with tests
  • Loading branch information
jsangmeister committed Sep 15, 2020
2 parents d0cfac9 + 10b2b08 commit 031b1f3
Show file tree
Hide file tree
Showing 8 changed files with 277 additions and 15 deletions.
16 changes: 1 addition & 15 deletions openslides_backend/action/motion_category/__init__.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,6 @@
from ..action import register_action
from ..base import DummyAction


@register_action("motion_category.create")
class MotionCategoryCreate(DummyAction):
pass


@register_action("motion_category.update")
class MotionCategoryUpdate(DummyAction):
pass


@register_action("motion_category.delete")
class MotionCategoryDelete(DummyAction):
pass
from . import create_update_delete # noqa


@register_action("motion_category.sort")
Expand Down
21 changes: 21 additions & 0 deletions openslides_backend/action/motion_category/create_update_delete.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from ...models.motion_category import MotionCategory
from ..action import register_action_set
from ..action_set import ActionSet
from ..default_schema import DefaultSchema


@register_action_set("motion_category")
class MotionCategoryActionSet(ActionSet):
"""
Actions to create, update and delete motion categories.
"""

model = MotionCategory()
create_schema = DefaultSchema(MotionCategory()).get_create_schema(
properties=["name", "prefix", "meeting_id", "parent_id"],
required_properties=["name", "prefix", "meeting_id"],
)
update_schema = DefaultSchema(MotionCategory()).get_update_schema(
properties=["name", "prefix", "motion_ids"]
)
delete_schema = DefaultSchema(MotionCategory()).get_delete_schema()
37 changes: 37 additions & 0 deletions openslides_backend/models/motion_category.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from ..shared.patterns import Collection
from . import fields
from .base import Model


class MotionCategory(Model):
"""
Model for motion category.
Reverse fields:
- child_ids: (motion_category/parent_id)[]
- motion_ids: (motion/category_id)[]
"""

collection = Collection("motion_category")
verbose_name = "motion_category"

id = fields.IdField(description="The id of this motion category.")
meeting_id = fields.RequiredForeignKeyField(
description="The id of the meeting of this motion_category.",
to=Collection("meeting"),
related_name="category_ids",
)
name = fields.RequiredCharField(
description="The name of this motion category.", maxLength=255
)
prefix = fields.RequiredCharField(
description="The prefix of this motion category.", maxLength=32
)
weight = fields.IntegerField(description="The weight of this motion category")
# TODO calculate the "level" field. (level: number;)
#
parent_id = fields.ForeignKeyField(
description="The parent of a motion_category",
to=Collection("motion_category"),
related_name="child_ids",
)
1 change: 1 addition & 0 deletions tests/system/action/meeting/old_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,7 @@ def test_prepare_dataset_1(self) -> None:
"instance": {
"id": self.valid_payload_1[0]["id"],
"agenda_item_ids": None,
"category_ids": None,
"committee_id": None,
"motion_block_ids": None,
"motion_ids": None,
Expand Down
Empty file.
109 changes: 109 additions & 0 deletions tests/system/action/motion_category/test_create.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
from tests.system.action.base import BaseActionTestCase
from tests.util import get_fqid


class MotionCategorySystemTest(BaseActionTestCase):
def test_create_good_case_full_fields(self) -> None:
self.create_model(get_fqid("meeting/222"), {"name": "name_SNLGsvIV"})
self.create_model(get_fqid("motion_category/123"), {"name": "name_bWdKLQxL"})
response = self.client.post(
"/",
json=[
{
"action": "motion_category.create",
"data": [
{
"name": "test_Xcdfgee",
"prefix": "prefix_niqCxoXA",
"meeting_id": 222,
"parent_id": 123,
}
],
}
],
)
self.assertEqual(response.status_code, 200)
self.assert_model_exists(get_fqid("motion_category/124"))
model = self.datastore.get(get_fqid("motion_category/124"))
assert model.get("name") == "test_Xcdfgee"
assert model.get("prefix") == "prefix_niqCxoXA"
assert model.get("meeting_id") == 222
assert model.get("parent_id") == 123

def test_create_good_case_only_required_fields(self) -> None:
self.create_model(get_fqid("meeting/222"), {"name": "name_SNLGsvIV"})
response = self.client.post(
"/",
json=[
{
"action": "motion_category.create",
"data": [
{
"name": "test_Xcdfgee",
"prefix": "prefix_niqCxoXA",
"meeting_id": 222,
}
],
}
],
)
self.assertEqual(response.status_code, 200)
self.assert_model_exists(get_fqid("motion_category/1"))
model = self.datastore.get(get_fqid("motion_category/1"))
assert model.get("name") == "test_Xcdfgee"
assert model.get("prefix") == "prefix_niqCxoXA"
assert model.get("meeting_id") == 222

def test_create_empty_data(self) -> None:
response = self.client.post(
"/", json=[{"action": "motion_category.create", "data": [{}]}],
)
self.assertEqual(response.status_code, 400)
self.assertIn(
"data[0] must contain [\\'name\\', \\'prefix\\', \\'meeting_id\\'] properties",
str(response.data),
)

def test_create_wrong_field(self) -> None:
response = self.client.post(
"/",
json=[
{
"action": "motion_category.create",
"data": [
{
"name": "test_Xcdfgee",
"prefix": "prefix_niqCxoXA",
"meeting_id": 222,
"wrong_field": "text_AefohteiF8",
}
],
}
],
)
self.assertEqual(response.status_code, 400)
self.assertIn(
"data[0] must contain only specified properties", str(response.data),
)

def test_create_link_non_existing_meeting(self) -> None:
response = self.client.post(
"/",
json=[
{
"action": "motion_category.create",
"data": [
{
"name": "test_Xcdfgee",
"prefix": "prefix_niqCxoXA",
"meeting_id": 222,
}
],
}
],
)
self.assertEqual(response.status_code, 400)
self.assertIn(
"You try to reference an instance of meeting that does not exist.",
str(response.data),
)
50 changes: 50 additions & 0 deletions tests/system/action/motion_category/test_delete.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from openslides_backend.shared.exceptions import DatabaseException
from tests.system.action.base import BaseActionTestCase
from tests.util import get_fqid


class MotionCategorySystemTest(BaseActionTestCase):
def test_delete_correct(self) -> None:
self.create_model(get_fqid("motion_category/111"), {"name": "name_srtgb123"})
response = self.client.post(
"/", json=[{"action": "motion_category.delete", "data": [{"id": 111}]}],
)
self.assertEqual(response.status_code, 200)
model = self.datastore.get(
get_fqid("motion_category/111"), get_deleted_models=2
)
assert model.get("meta_deleted")

def test_delete_wrong_id(self) -> None:
self.create_model(get_fqid("motion_category/112"), {"name": "name_srtgb123"})
with self.assertRaises(DatabaseException):
self.client.post(
"/", json=[{"action": "motion_category.delete", "data": [{"id": 111}]}],
)
self.assert_model_exists(get_fqid("motion_category/112"))

def test_delete_handle_remove_releation(self) -> None:
self.create_model(
get_fqid("meeting/222"), {"name": "name_xQyvfmsS", "category_ids": [111]}
)
self.create_model(
get_fqid("motion/89"),
{"name": "name_morZjXig", "meeting_id": 222, "category_id": 89},
)
self.create_model(
get_fqid("motion_category/111"),
{
"name": "name_srtgb123",
"prefix": "prefix_JmDHFgvH",
"meeting_id": 222,
"motion_ids": [89],
},
)
model = self.datastore.get(get_fqid("motion/89"))

assert model.get("category_id") == 89
self.client.post(
"/", json=[{"action": "motion_category.delete", "data": [{"id": 111}]}],
)
model = self.datastore.get(get_fqid("motion/89"))
assert model.get("category_id") is None
58 changes: 58 additions & 0 deletions tests/system/action/motion_category/test_update.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from openslides_backend.shared.exceptions import DatabaseException
from tests.system.action.base import BaseActionTestCase
from tests.util import get_fqid


class MotionCategorySystemTest(BaseActionTestCase):
def test_update_correct_all_fields(self) -> None:
self.create_model(get_fqid("meeting/222"), {"name": "name_xQyvfmsS"})

self.create_model(
get_fqid("motion/89"), {"name": "name_morZjXig", "meeting_id": 222},
)
self.create_model(
get_fqid("motion_category/111"),
{"name": "name_srtgb123", "prefix": "prefix_JmDHFgvH", "meeting_id": 222},
)
response = self.client.post(
"/",
json=[
{
"action": "motion_category.update",
"data": [
{
"id": 111,
"name": "name_Xcdfgee",
"prefix": "prefix_sthyAKrW",
"motion_ids": [89],
}
],
}
],
)
self.assertEqual(response.status_code, 200)

self.assert_model_exists(get_fqid("motion_category/111"))
model = self.datastore.get(get_fqid("motion_category/111"))
assert model.get("name") == "name_Xcdfgee"
assert model.get("prefix") == "prefix_sthyAKrW"
assert model.get("motion_ids") == [89]

def test_update_wrong_id(self) -> None:
self.create_model(get_fqid("meeting/222"), {"name": "name_xQyvfmsS"})
self.create_model(
get_fqid("motion_category/111"),
{"name": "name_srtgb123", "prefix": "prefix_JmDHFgvH", "meeting_id": 222},
)
with self.assertRaises(DatabaseException):
self.client.post(
"/",
json=[
{
"action": "motion_category.update",
"data": [{"id": 112, "name": "name_Xcdfgee"}],
}
],
)
model = self.datastore.get(get_fqid("motion_category/111"))
assert model.get("name") == "name_srtgb123"

0 comments on commit 031b1f3

Please sign in to comment.