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.
expect(container.firstChild.getAttribute('customAttribute')).toBe(
        'hello',
      );
    });
    it('passes objects on known SVG attributes if they do not define toString', () => {
      var obj = {};
      var container = document.createElement('div');
      ReactDOM.render(<svg arabicForm={obj} />, container);
      expect(container.firstChild.getAttribute('arabic-form')).toBe(
        '[object Object]',
      );
    });
    it('passes objects on custom attributes if they do not define toString', () => {
      var obj = {};
      var container = document.createElement('div');
      ReactDOM.render(<div customAttribute={obj} />, container);
      expect(container.firstChild.getAttribute('customAttribute')).toBe(
        '[object Object]',
      );
    });
    it('allows objects that inherit a custom toString method', function() {
      var parent = {toString: () => 'hello.jpg'};
      var child = Object.create(parent);
      var el = ReactTestUtils.renderIntoDocument(<img src={child} />);
      expect(el.src).toBe('hello.jpg');
    });
    it('assigns ajaxify (an important internal FB attribute)', function() {
      var options = {toString: () => 'ajaxy'};
      var el = ReactTestUtils.renderIntoDocument(<div ajaxify={options} />);
      expect(el.getAttribute('ajaxify')).toBe('ajaxy');