def test_update_existing_domain_nested(self):
     block = Block.objects.create(name='b1', order=5)
     toolbox = Toolbox.objects.create(name='tb1')
     toolbox.blocks.set([block])
     domain = Domain.objects.create(name='test1')
     domain.blocks.set([block])
     domain.toolboxes.set([toolbox])
     data = {
         "name":
         "test1",
         "problemsets": [],
         "tasks": [],
         "toolboxes": [{
             "id": toolbox.pk,
             "name": "tb1",
             "blocks": ["b2", "b3"]
         }],
         "blocks": [{
             "id": 2,
             "name": "b2"
         }, {
             "id": 3,
             "name": "b3"
         }]
     }
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(domain.toolboxes.all(), ['<Toolbox: tb1>'])
     self.assertQuerysetEqual(domain.toolboxes.first().blocks.all(),
                              ['<Block: b2>', '<Block: b3>'])
 def test_update_domain_same_names(self):
     """Test that no uniqeue name constraint error is raised when updating
        and existing entity, leaving its name same.
     """
     block = Block.objects.create(name='b1', order=5)
     toolbox = Toolbox.objects.create(name='tb1')
     ps = ProblemSet.objects.create(name='ps')
     domain = Domain.objects.create(name='test1')
     domain.blocks.set([block])
     domain.toolboxes.set([toolbox])
     domain.problemsets.set([ps])
     data = {
         "name": "test1",
         "problemsets": [{
             "id": ps.pk,
             "name": "ps"
         }],
         "tasks": [],
         "toolboxes": [{
             "id": toolbox.pk,
             "name": "tb1",
             "blocks": []
         }],
         "blocks": [{
             "id": block.id,
             "name": "b1"
         }]
     }
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(domain.blocks.all(), ['<Block: b1>'])
     self.assertQuerysetEqual(domain.toolboxes.all(), ['<Toolbox: tb1>'])
     self.assertQuerysetEqual(domain.problemsets.all(),
                              ['<ProblemSet: ps>'])
 def test_nested_deserialization(self):
     data = {
         "name": "test1", "problemsets" : [], "tasks": [],
         "toolboxes": [{"id": 1, "name": "tb1", "blocks": ["b1", "b2"]}],
         "blocks": [{"id": 1, "name": "b1"}, {"id": 2, "name": "b2"}]}
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(
         domain.toolboxes.first().blocks.all(),
         ['<Block: b1>', '<Block: b2>'])
 def test_update_existing_domain_with_toolbox(self):
     toolbox = Toolbox.objects.create(name='tb1')
     domain = Domain.objects.create(name='test1')
     domain.toolboxes.set([toolbox])
     data = {
         "name": "test1",
         "problemsets" : [], "tasks": [], "blocks": [],
         "toolboxes": [{"id": toolbox.pk, "name": "tb1n", "blocks": []}]}
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(domain.toolboxes.all(), ['<Toolbox: tb1n>'])
 def test_update_existing_domain(self):
     block = Block.objects.create(name='b1', order=5)
     domain = Domain.objects.create(name='test1')
     domain.blocks.set([block])
     data = {
         "name": "test1",
         "problemsets" : [], "tasks": [], "toolboxes": [],
         "blocks": [{"id": block.id, "name": "b2"}, {"id": 3, "name": "b3"}]}
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(
         domain.blocks.all(),
         ['<Block: b2>', '<Block: b3>'])
 def test_domain_with_hierarchical_ps_deserialization(self):
     data = {
         "name": "test1", "blocks" : [], "toolboxes": [], "tasks": [],
         "problemsets": [
             {"id": 1, "name": "m1", "parts": ["p1"]},
             {"id": 2, "name": "p1"}]}
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     m1 = domain.problemsets.get(name='m1')
     assert m1.name == 'm1'
     assert m1.section == '1'
     assert m1.parts.count() == 1
     assert m1.parts.first().name == 'p1'
 def test_update_existing_domain_with_toolbox(self):
     toolbox = Toolbox.objects.create(name='tb1')
     domain = Domain.objects.create(name='test1')
     domain.toolboxes.set([toolbox])
     data = {
         "name": "test1",
         "problemsets": [],
         "tasks": [],
         "blocks": [],
         "toolboxes": [{
             "id": toolbox.pk,
             "name": "tb1n",
             "blocks": []
         }]
     }
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(domain.toolboxes.all(), ['<Toolbox: tb1n>'])
 def test_update_existing_domain_nested(self):
     block = Block.objects.create(name='b1', order=5)
     toolbox = Toolbox.objects.create(name='tb1')
     toolbox.blocks.set([block])
     domain = Domain.objects.create(name='test1')
     domain.blocks.set([block])
     domain.toolboxes.set([toolbox])
     data = {
         "name": "test1", "problemsets" : [], "tasks": [],
         "toolboxes": [{"id": toolbox.pk, "name": "tb1", "blocks": ["b2", "b3"]}],
         "blocks": [{"id": 2, "name": "b2"}, {"id": 3, "name": "b3"}]}
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(
         domain.toolboxes.all(),
         ['<Toolbox: tb1>'])
     self.assertQuerysetEqual(
         domain.toolboxes.first().blocks.all(),
         ['<Block: b2>', '<Block: b3>'])
 def test_update_existing_domain(self):
     block = Block.objects.create(name='b1', order=5)
     domain = Domain.objects.create(name='test1')
     domain.blocks.set([block])
     data = {
         "name": "test1",
         "problemsets": [],
         "tasks": [],
         "toolboxes": [],
         "blocks": [{
             "id": block.id,
             "name": "b2"
         }, {
             "id": 3,
             "name": "b3"
         }]
     }
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(domain.blocks.all(),
                              ['<Block: b2>', '<Block: b3>'])
def load_domain_from_file(name='domain/domain.json'):
    path = os.path.join(settings.REPO_DIR, 'backend', name)
    with open(path) as infile:
        data = json.load(infile)
    task_dir = os.path.join(os.path.dirname(path), data['include']['tasks'])
    inject_tasks_data(data['tasks'], task_dir)
    # TODO: inject order?
    serializer = DomainSerializer()
    domain = serializer.create_or_update(data)
    params_path = os.path.normpath(
        os.path.join(os.path.dirname(path), data['include']['params']))
    load_domain_params(domain, params_path)
    return domain
 def test_nested_deserialization(self):
     data = {
         "name": "test1",
         "problemsets": [],
         "tasks": [],
         "toolboxes": [{
             "id": 1,
             "name": "tb1",
             "blocks": ["b1", "b2"]
         }],
         "blocks": [{
             "id": 1,
             "name": "b1"
         }, {
             "id": 2,
             "name": "b2"
         }]
     }
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(domain.toolboxes.first().blocks.all(),
                              ['<Block: b1>', '<Block: b2>'])
 def test_update_domain_same_names(self):
     """Test that no uniqeue name constraint error is raised when updating
        and existing entity, leaving its name same.
     """
     block = Block.objects.create(name='b1', order=5)
     toolbox = Toolbox.objects.create(name='tb1')
     ps = ProblemSet.objects.create(name='ps')
     domain = Domain.objects.create(name='test1')
     domain.blocks.set([block])
     domain.toolboxes.set([toolbox])
     domain.problemsets.set([ps])
     data = {
         "name": "test1",
         "problemsets" : [{"id": ps.pk, "name": "ps"}],
         "tasks": [],
         "toolboxes": [{"id": toolbox.pk, "name": "tb1", "blocks": []}],
         "blocks": [{"id": block.id, "name": "b1"}]}
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     self.assertQuerysetEqual(domain.blocks.all(), ['<Block: b1>'])
     self.assertQuerysetEqual(domain.toolboxes.all(), ['<Toolbox: tb1>'])
     self.assertQuerysetEqual(domain.problemsets.all(), ['<ProblemSet: ps>'])
 def test_domain_with_hierarchical_ps_deserialization(self):
     data = {
         "name":
         "test1",
         "blocks": [],
         "toolboxes": [],
         "tasks": [],
         "problemsets": [{
             "id": 1,
             "name": "m1",
             "parts": ["p1"]
         }, {
             "id": 2,
             "name": "p1"
         }]
     }
     serializer = DomainSerializer()
     serializer.create_or_update(data)
     domain = Domain.objects.get(name='test1')
     m1 = domain.problemsets.get(name='m1')
     assert m1.name == 'm1'
     assert m1.section == '1'
     assert m1.parts.count() == 1
     assert m1.parts.first().name == 'p1'