def test_family_detail_serializer_update__create_children(self):
        data = dict(self.family_data)
        new_child_data = {
            "id": None,
            "first_name": "Pableaux",
            "last_name": "Petersaune",
            "role": "Child",
            "date_of_birth": "2020-02-06",
            "family": self.family,
            "information": {},
        }
        data["children"].append(new_child_data)

        serializer = FamilyDetailSerializer(instance=self.family, data=data)
        self.assertTrue(serializer.is_valid())
        self.assertEqual(self.family.children.count(), 2)
        family = serializer.save()
        self.assertEqual(family.children.count(), 3)

        new_child = family.children.order_by("-created_at").first()
        self.assertEqual(new_child.first_name, new_child_data["first_name"])
        self.assertEqual(new_child.last_name, new_child_data["last_name"])
        self.assertEqual(
            new_child.date_of_birth.strftime(format="%Y-%m-%d"),
            new_child_data["date_of_birth"],
        )
        self.assertEqual(new_child.information, new_child_data["information"])
    def test_family_detail_serializer_update__delete_children(self):
        data = dict(self.family_data)
        data["children"].pop(1)

        serializer = FamilyDetailSerializer(instance=self.family, data=data)
        self.assertTrue(serializer.is_valid())
        self.assertEqual(self.family.children.count(), 2)
        family = serializer.save()

        self.assertEqual(family.children.count(), 1)
        self.assertEqual(family.children.first(), self.child)
    def test_family_detail_serializer_update__read_only(self):  # should fail
        data = dict(self.family_data)
        old_child_role = data["children"][0]["role"]
        old_child_family = data["children"][0]["family"]
        data["children"][0]["role"] = "Guest"
        data["children"][0]["family"] = None

        serializer = FamilyDetailSerializer(instance=self.family, data=data)
        self.assertTrue(serializer.is_valid())
        family = serializer.save()

        self.assertEqual(family.children[0].role, old_child_role)
        self.assertEqual(family.children[0].family, old_child_family)
    def test_family_detail_serializer_update(self):
        data = dict(self.family_data)
        data["email"] = "new_email"
        data["home_number"] = "new_home_number"
        data["preferred_comms"] = "Phone"

        serializer = FamilyDetailSerializer(instance=self.family, data=data)
        self.assertTrue(serializer.is_valid())
        family = serializer.save()

        self.assertEqual(family.email, data["email"])
        self.assertEqual(family.home_number, data["home_number"])
        self.assertEqual(family.preferred_comms, data["preferred_comms"])
    def test_get_family(self):
        url = reverse("family-detail", args=[self.family.id])
        self.client.force_authenticate(self.user)
        response = self.client.get(url)
        payload = response.json()

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertNotEqual(payload, FamilySerializer(self.family).data)
        self.assertEqual(payload, FamilyDetailSerializer(self.family).data)
    def test_family_detail_serializer_update__update_children(self):
        data = dict(self.family_data)
        new_name = "Pablo"
        data["children"][0]["first_name"] = new_name

        serializer = FamilyDetailSerializer(instance=self.family, data=data)
        self.assertTrue(serializer.is_valid())
        family = serializer.save()

        self.assertEqual(family.children.first().first_name, new_name)
        self.assertEqual(family.children.first().last_name,
                         self.children_data[0]["last_name"])
        self.assertEqual(
            family.children.first().date_of_birth.strftime(format="%Y-%m-%d"),
            self.children_data[0]["date_of_birth"],
        )
        self.assertEqual(family.children.first().information,
                         self.children_data[0]["information"])
    def test_get_families(self):
        url = reverse("family-list")
        self.client.force_authenticate(self.user)
        response = self.client.get(url)
        payload = response.json()

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(
            payload,
            [
                FamilySerializer(self.family).data,
                FamilySerializer(self.other_family).data,
            ],
        )
        self.assertNotEqual(
            payload,
            [
                FamilyDetailSerializer(self.family).data,
                FamilyDetailSerializer(self.other_family).data,
            ],
        )
 def test_family_detail_serializer_guests(self):
     data = FamilyDetailSerializer(self.family, context=context).data
     self.assertEqual(data["guests"],
                      [StudentSerializer(self.guest, context=context).data])
 def test_family_detail_serializer_children(self):
     data = FamilyDetailSerializer(self.family, context=context).data
     self.assertEqual(data["children"],
                      [StudentSerializer(self.child, context=context).data])
 def test_family_detail_serializer_parent(self):
     data = FamilyDetailSerializer(self.family, context=context).data
     self.assertEqual(data["parent"],
                      StudentSerializer(self.parent, context=context).data)