shared_examples 'message with a header' do
  describe 'header' do
    describe 'length' do
      let(:field) { bytes.to_s[0..3] }
      it 'serializes the length' do
        expect(field).to be_int32(bytes.length)
      end
    end

    describe 'request id' do
      let(:field) { bytes.to_s[4..7] }
      it 'serializes the request id' do
        expect(field).to be_int32(message.request_id)
      end
    end

    describe 'response to' do
      let(:field) { bytes.to_s[8..11] }
      it 'serializes the response to' do
        expect(field).to be_int32(0)
      end
    end

    describe 'op code' do
      let(:field) { bytes.to_s[12..15] }
      it 'serializes the op code' do
        expect(field).to be_int32(opcode)
      end
    end
  end
end
