code: def assert_child_key_has_value(self, parent, child, caller):
          
          assert parent, ("parent parameter must be specified.")
          assert child, ("child parameter must be specified.")
          self.assert_key_has_value(parent, caller)
  
          try:
              child_exists = child in self[parent]
          except TypeError as err:
              # This happens if parent isn't iterable
              raise ContextError(
                  f"context['{parent}'] must be iterable and contain '{child}' "
                  f"for {caller}. {err}") from err
  
          if child_exists:
              if self[parent][child] is None:
                  raise KeyInContextHasNoValueError(
                      f"context['{parent}']['{child}'] must have a value for "
                      f"{caller}.")
          else:
              raise KeyNotInContextError(
                  f"context['{parent}']['{child}'] doesn't "
                  f"exist. It must exist for {caller}.")
docs: Assert that context contains key that has child which has a value.
  
          Args:
              parent: parent key
              child: validate this sub-key of parent exists AND isn't None.
              caller: string. calling function name - this used to construct
                      error messages
  
          Raises:
              KeyNotInContextError: Key doesn't exist
              KeyInContextHasNoValueError: context[key] is None
              AssertionError: if key is None