It seems problematic to allow arbitary non-lowercase attribute on HTML nodes. Because the server has no ability to keep them case sensitive (HTML isn't). So they will end up different on the client.

We should probably warn if the attribute is not a known one *and* is not lowercase.
render() {
              return undefined;
            }
          }
          await render(<UndefinedComponent />, 1);
        },
        ReactDOMFeatureFlags.useFiber
          ? 'UndefinedComponent(...): Nothing was returned from render. ' +
              'This usually means a return statement is missing. Or, to ' +
              'render nothing, return null.'
          : 'A valid React element (or null) must be returned. ' +
              'You may have returned undefined, an array or some other invalid object.',
      );
      itThrowsWhenRendering(
        'a function returning an object',
        async render => {
          const ObjectComponent = () => ({x: 123});
          await render(<ObjectComponent />, 1);
        },
        ReactDOMFeatureFlags.useFiber
          ? 'Objects are not valid as a React child (found: object with keys ' +
              '{x}). If you meant to render a collection of children, use ' +
              'an array instead.'
          : 'A valid React element (or null) must be returned. ' +
              'You may have returned undefined, an array or some other invalid object.',
      );
      itThrowsWhenRendering(
        'a class returning an object',
        async render => {
          class ObjectComponent extends React.Component {