Example #1
0
  def testSplitIfRelativeReference_withMalformedUri_raises(self):
    ref = datatypes_pb2.Reference(uri=datatypes_pb2.String(value='InvalidUri'))

    with self.assertRaises(ValueError) as e:
      references.split_if_relative_reference(ref)

    self.assertIsInstance(e.exception, ValueError)
    def testSplitIfRelativeReference_withUrlScheme_succeeds(self):
        ref = datatypes_pb2.Reference(uri=datatypes_pb2.String(
            value='http://acme.com/ehr/fhir/Practitioner/2323-33-4'))

        references.split_if_relative_reference(ref)

        uri_field = ref.DESCRIPTOR.fields_by_name['uri']
        self.assertEqual(
            proto_utils.get_value_at_field(ref, uri_field),
            datatypes_pb2.String(
                value='http://acme.com/ehr/fhir/Practitioner/2323-33-4'))
    def testSplitIfRelativeReference_withFragmentReference_succeeds(self):
        ref = datatypes_pb2.Reference(uri=datatypes_pb2.String(value='#org-1'))

        uri_field = ref.DESCRIPTOR.fields_by_name['uri']
        fragment_field = ref.DESCRIPTOR.fields_by_name['fragment']
        self.assertTrue(proto_utils.field_is_set(ref, uri_field))
        self.assertFalse(proto_utils.field_is_set(ref, fragment_field))

        references.split_if_relative_reference(ref)

        self.assertFalse(proto_utils.field_is_set(ref, uri_field))
        self.assertTrue(proto_utils.field_is_set(ref, fragment_field))
        self.assertEqual(proto_utils.get_value_at_field(ref, fragment_field),
                         datatypes_pb2.String(value='org-1'))
Example #4
0
    def merge_value(self, json_value: Any, target: message.Message):
        """Merges the provided json_value into the target Message.

    Args:
      json_value: A Python-native representation of JSON data.
      target: The target Message to merge the JSON data into.
    """
        target_descriptor = target.DESCRIPTOR
        if annotation_utils.is_primitive_type(target_descriptor):
            if isinstance(json_value, dict):
                # This is a primitive type extension. Merge the extension fields into
                # the empty target proto, and tag it as having no value.
                self._merge_message(json_value, target)

                extension_field = target_descriptor.fields_by_name.get(
                    'extension')
                if extension_field is None:
                    raise ValueError(
                        "Invalid primitive. No 'extension' field exists on "
                        f"{target_descriptor.full_name}.")
                primitive_has_no_value = extensions.create_primitive_has_no_value(
                    extension_field.message_type)
                proto_utils.append_value_at_field(target, extension_field,
                                                  primitive_has_no_value)
            else:
                wrapper = self.primitive_handler.primitive_wrapper_from_json_value(
                    json_value,
                    type(target),
                    default_timezone=self.default_timezone)
                wrapper.merge_into(target)
        elif annotation_utils.is_reference(target_descriptor):
            self._merge_message(json_value, target)
            references.split_if_relative_reference(target)
        else:
            if isinstance(json_value, dict):
                # The provided value must be another FHIR element
                self._merge_message(json_value, target)
            elif isinstance(json_value,
                            (tuple, list)) and len(json_value) == 1:
                # Check if the target field is non-repeated, and we're trying to
                # populate it with a single-element array. This is considered valid, and
                # occurs when a profiled resource reduces the size of a repeated FHIR
                # field to a maximum of 1.
                self._merge_message(json_value[0], target)
            else:
                raise ValueError(
                    'Expected a JSON object for field of type: {}.'.format(
                        target_descriptor.full_name))
  def testSplitIfRelativeReference_withRelativeReference_succeeds(self):
    ref = datatypes_pb2.Reference(
        uri=datatypes_pb2.String(value='Practitioner/example'),
        display=datatypes_pb2.String(value='Dr Adam Careful'))

    uri_field = ref.DESCRIPTOR.fields_by_name['uri']
    practitioner_id_field = ref.DESCRIPTOR.fields_by_name['practitioner_id']
    self.assertTrue(proto_utils.field_is_set(ref, uri_field))
    self.assertFalse(proto_utils.field_is_set(ref, practitioner_id_field))

    references.split_if_relative_reference(ref)

    self.assertFalse(proto_utils.field_is_set(ref, uri_field))
    self.assertTrue(proto_utils.field_is_set(ref, practitioner_id_field))
    self.assertEqual(
        proto_utils.get_value_at_field(ref, practitioner_id_field),
        datatypes_pb2.ReferenceId(value='example'))