-
Notifications
You must be signed in to change notification settings - Fork 24
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #83 from reiterl/dev1
Add motion_category action set with tests
- Loading branch information
Showing
8 changed files
with
277 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
21 changes: 21 additions & 0 deletions
21
openslides_backend/action/motion_category/create_update_delete.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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", | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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), | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |