Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
messages.cpp 31.51 KiB
#include <gtest/gtest.h>

#include <mtx.hpp>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

using namespace mtx::events;

TEST(RoomEvents, Reaction)
{
        json data = R"({
  "type": "m.reaction",
  "room_id": "!CYvyeleADEeDAsndMom:localhost",
  "sender": "@example:localhost",
  "content": {
    "m.relates_to": {
      "rel_type": "m.annotation",
      "event_id": "$oGKg0tfsnDamWPsGxUptGLWR5b8Xq6QNFFsysQNSnake",
      "key": "👀"
    }
  },
  "origin_server_ts": 1588536414112,
  "unsigned": {
    "age": 1905609
  },
  "event_id": "$ujXAq1WXebS-vcpA4yBIZPvCeqGvnrMFP1c1qn8_wJump"
  })"_json;

        RoomEvent<msg::Reaction> event = data;

        EXPECT_EQ(event.type, EventType::Reaction);
        EXPECT_EQ(event.event_id, "$ujXAq1WXebS-vcpA4yBIZPvCeqGvnrMFP1c1qn8_wJump");
        EXPECT_EQ(event.room_id, "!CYvyeleADEeDAsndMom:localhost");
        EXPECT_EQ(event.sender, "@example:localhost");
        EXPECT_EQ(event.origin_server_ts, 1588536414112L);
        EXPECT_EQ(event.unsigned_data.age, 1905609L);
        EXPECT_EQ(event.content.relates_to.event_id,
                  "$oGKg0tfsnDamWPsGxUptGLWR5b8Xq6QNFFsysQNSnake");
        EXPECT_EQ(event.content.relates_to.key, "👀");
        EXPECT_EQ(event.content.relates_to.rel_type, mtx::common::RelationType::Annotation);

        EXPECT_EQ(data.dump(), json(event).dump());
}

TEST(RoomEvents, Redacted)
{
        json data = R"({
	  "unsigned": {
            "age": 146,
	    "redacted_by": "$152135702813129HltcO:matrix.org"
	  },
          "content": {},
          "event_id": "$143273582443PhrSn:localhost",
          "origin_server_ts": 1432735824653,
          "room_id": "!jEsUZKDJdhlrceRyVU:localhost",
          "sender": "@example:localhost",
          "type": "m.room.message"
        })"_json;

        RoomEvent<msg::Redacted> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$143273582443PhrSn:localhost");
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:localhost");
        EXPECT_EQ(event.sender, "@example:localhost");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.unsigned_data.age, 146);
        EXPECT_EQ(event.unsigned_data.redacted_by, "$152135702813129HltcO:matrix.org");
}

TEST(RoomEvents, AudioMessage)
{
        json data = R"({
	  "unsigned": {
            "age": 146
	  },
          "content": {
              "body": "Bee Gees - Stayin' Alive",
              "info": {
                  "duration": 2140786,
                  "mimetype": "audio/mpeg",
                  "size": 1563685
              },
              "msgtype": "m.audio",
              "url": "mxc://localhost/ffed755USFFxlgbQYZGtryd",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "event_id": "$143273582443PhrSn:localhost",
          "origin_server_ts": 1432735824653,
          "room_id": "!jEsUZKDJdhlrceRyVU:localhost",
          "sender": "@example:localhost",
          "type": "m.room.message"
        })"_json;

        RoomEvent<msg::Audio> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$143273582443PhrSn:localhost");
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:localhost");
        EXPECT_EQ(event.sender, "@example:localhost");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.unsigned_data.age, 146);

        EXPECT_EQ(event.content.body, "Bee Gees - Stayin' Alive");
        EXPECT_EQ(event.content.msgtype, "m.audio");
        EXPECT_EQ(event.content.url, "mxc://localhost/ffed755USFFxlgbQYZGtryd");
        EXPECT_EQ(event.content.info.mimetype, "audio/mpeg");
        EXPECT_EQ(event.content.info.size, 1563685);
        EXPECT_EQ(event.content.info.duration, 2140786);
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");
}

TEST(RoomEvents, EmoteMessage)
{
        json data = R"({
          "origin_server_ts": 1509878682149,
          "sender": "@mujx:matrix.org",
          "event_id": "$15098786822025533uttji:matrix.org",
          "unsigned": {
            "age": 626351821
          },
          "content": {
            "body": "tests",
            "msgtype": "m.emote",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "type": "m.room.message",
          "room_id": "!VaMCVKSVcyPtXbcMXh:matrix.org"
        })"_json;
        RoomEvent<msg::Emote> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$15098786822025533uttji:matrix.org");
        EXPECT_EQ(event.room_id, "!VaMCVKSVcyPtXbcMXh:matrix.org");
        EXPECT_EQ(event.sender, "@mujx:matrix.org");
        EXPECT_EQ(event.origin_server_ts, 1509878682149L);
        EXPECT_EQ(event.unsigned_data.age, 626351821);
        EXPECT_EQ(event.content.body, "tests");
        EXPECT_EQ(event.content.msgtype, "m.emote");
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");
}

TEST(RoomEvents, FileMessage)
{
        json data = R"({
          "origin_server_ts": 1510485607737,
          "sender": "@nheko_test:matrix.org",
          "event_id": "$15104856072749611ERqhw:matrix.org",
          "unsigned": {
            "age": 31,
            "transaction_id": "m1510485607454.1"
          },
          "content": {
            "body": "optimize.pdf",
            "info": {
              "mimetype": "application/pdf",
              "size": 40565,
	      "thumbnail_info": {
                "h": 200,
                "mimetype": "image/png",
                "size": 73602,
                "w": 140
              },
	      "thumbnail_url": "mxc://matrix.org/XpxykZBESCSQnYkLKbbIKnVn"
            },
            "msgtype": "m.file",
            "url": "mxc://matrix.org/XpxykZBESCSQnYkLKbbIKnVn",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "type": "m.room.message",
          "room_id": "!lfoDRlNFWlvOnvkBwQ:matrix.org"
        })"_json;

        RoomEvent<msg::File> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$15104856072749611ERqhw:matrix.org");
        EXPECT_EQ(event.room_id, "!lfoDRlNFWlvOnvkBwQ:matrix.org");
        EXPECT_EQ(event.sender, "@nheko_test:matrix.org");
        EXPECT_EQ(event.origin_server_ts, 1510485607737L);
        EXPECT_EQ(event.unsigned_data.age, 31);
        EXPECT_EQ(event.unsigned_data.transaction_id, "m1510485607454.1");

        EXPECT_EQ(event.content.body, "optimize.pdf");
        EXPECT_EQ(event.content.msgtype, "m.file");
        EXPECT_EQ(event.content.url, "mxc://matrix.org/XpxykZBESCSQnYkLKbbIKnVn");
        EXPECT_EQ(event.content.info.mimetype, "application/pdf");
        EXPECT_EQ(event.content.info.size, 40565);
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");

        json withThumb = event;
        EXPECT_EQ(withThumb["content"]["info"].count("thumbnail_url"), 1);
        EXPECT_EQ(withThumb["content"]["info"].count("thumbnail_info"), 1);

        event.content.info.thumbnail_url = "";
        json withoutThumb                = event;
        EXPECT_EQ(withoutThumb["content"]["info"].count("thumbnail_url"), 0);
        EXPECT_EQ(withoutThumb["content"]["info"].count("thumbnail_info"), 0);
}

TEST(RoomEvents, EncryptedImageMessage)
{
        json data                   = R"(
{
  "content": {
    "body": "something-important.jpg",
    "file": {
      "url": "mxc://example.org/FHyPlCeYUSFFxlgbQYZmoEoe",
      "mimetype": "image/jpeg",
      "v": "v2",
      "key": {
        "alg": "A256CTR",
        "ext": true,
        "k": "aWF6-32KGYaC3A_FEUCk1Bt0JA37zP0wrStgmdCaW-0",
        "key_ops": ["encrypt","decrypt"],
        "kty": "oct"
      },
      "iv": "w+sE15fzSc0AAAAAAAAAAA",
      "hashes": {
        "sha256": "fdSLu/YkRx3Wyh3KQabP3rd6+SFiKg5lsJZQHtkSAYA"
      }
    },
    "info": {
      "mimetype": "image/jpeg",
      "h": 1536,
      "size": 422018,
      "thumbnail_file": {
        "hashes": {
          "sha256": "/NogKqW5bz/m8xHgFiH5haFGjCNVmUIPLzfvOhHdrxY"
        },
        "iv": "U+k7PfwLr6UAAAAAAAAAAA",
        "key": {
          "alg": "A256CTR",
          "ext": true,
          "k": "RMyd6zhlbifsACM1DXkCbioZ2u0SywGljTH8JmGcylg",
          "key_ops": ["encrypt", "decrypt"],
          "kty": "oct"
        },
        "mimetype": "image/jpeg",
        "url": "mxc://example.org/pmVJxyxGlmxHposwVSlOaEOv",
        "v": "v2"
      },
      "thumbnail_info": {
        "h": 768,
        "mimetype": "image/jpeg",
        "size": 211009,
        "w": 432
      },
      "w": 864
    },
    "msgtype": "m.image"
  },
  "event_id": "$143273582443PhrSn:example.org",
  "origin_server_ts": 1432735824653,
  "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
  "sender": "@example:example.org",
  "type": "m.room.message",
  "unsigned": {
      "age": 1234
  }
})"_json;
        RoomEvent<msg::Image> event = data;
        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$143273582443PhrSn:example.org");
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:example.org");
        EXPECT_EQ(event.sender, "@example:example.org");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.unsigned_data.age, 1234);

        EXPECT_EQ(event.content.body, "something-important.jpg");
        EXPECT_EQ(event.content.msgtype, "m.image");
        EXPECT_EQ(event.content.url, "");
        EXPECT_EQ(event.content.info.mimetype, "image/jpeg");
        EXPECT_EQ(event.content.info.size, 422018);
        EXPECT_EQ(event.content.file.value().url, "mxc://example.org/FHyPlCeYUSFFxlgbQYZmoEoe");
        EXPECT_EQ(event.content.info.thumbnail_file.value().url,
                  "mxc://example.org/pmVJxyxGlmxHposwVSlOaEOv");
}

TEST(RoomEvents, ImageMessage)
{
        json data = R"({
          "origin_server_ts": 1510504294993,
          "sender": "@max:kamax.io",
          "event_id": "$15105042942524OGmZm:kamax.io",
          "unsigned": {
            "age": 738977
          },
          "content": {
            "body": "image.png",
            "info": {
              "mimetype": "image/png",
              "thumbnail_info": {
                "mimetype": "image/png",
                "h": 302,
                "w": 474,
                "size": 33504
              },
              "h": 302,
              "thumbnail_url": "mxc://kamax.io/IlTRDmpGMPkiwlyYUpHXSqjH",
              "w": 474,
              "size": 32573
            },
            "msgtype": "m.image",
            "url": "mxc://kamax.io/ewDDLHYnysbHYCPViZwAEIjT",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "type": "m.room.message",
          "room_id": "!cURbafjkfsMDVwdRDQ:matrix.org"
        })"_json;

        RoomEvent<msg::Image> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$15105042942524OGmZm:kamax.io");
        EXPECT_EQ(event.room_id, "!cURbafjkfsMDVwdRDQ:matrix.org");
        EXPECT_EQ(event.sender, "@max:kamax.io");
        EXPECT_EQ(event.origin_server_ts, 1510504294993L);
        EXPECT_EQ(event.unsigned_data.age, 738977);

        EXPECT_EQ(event.content.body, "image.png");
        EXPECT_EQ(event.content.info.mimetype, "image/png");
        EXPECT_EQ(event.content.info.h, 302);
        EXPECT_EQ(event.content.info.w, 474);
        EXPECT_EQ(event.content.info.size, 32573);
        EXPECT_EQ(event.content.info.thumbnail_url, "mxc://kamax.io/IlTRDmpGMPkiwlyYUpHXSqjH");
        EXPECT_EQ(event.content.info.thumbnail_info.mimetype, "image/png");
        EXPECT_EQ(event.content.info.thumbnail_info.w, 474);
        EXPECT_EQ(event.content.info.thumbnail_info.h, 302);
        EXPECT_EQ(event.content.info.thumbnail_info.size, 33504);
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");

        json withThumb = event;
        EXPECT_EQ(withThumb["content"]["info"].count("thumbnail_url"), 1);
        EXPECT_EQ(withThumb["content"]["info"].count("thumbnail_info"), 1);

        event.content.info.thumbnail_url = "";
        json withoutThumb                = event;
        EXPECT_EQ(withoutThumb["content"]["info"].count("thumbnail_url"), 0);
        EXPECT_EQ(withoutThumb["content"]["info"].count("thumbnail_info"), 0);

        data = R"({
          "origin_server_ts": 1510504294993,
          "sender": "@max:kamax.io",
          "event_id": "$15105042942524OGmZm:kamax.io",
          "unsigned": {
            "age": 738977
          },
          "content": {
            "body": "image.png",
            "info": {
              "mimetype": "image/png",
              "thumbnail_info": {
                "mimetype": "image/png",
                "h": null,
                "w": null,
                "size": null
              },
              "h": null,
              "thumbnail_url": "mxc://kamax.io/IlTRDmpGMPkiwlyYUpHXSqjH",
              "w": null,
              "size": null
            },
            "msgtype": "m.image",
            "url": "mxc://kamax.io/ewDDLHYnysbHYCPViZwAEIjT",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "type": "m.room.message",
          "room_id": "!cURbafjkfsMDVwdRDQ:matrix.org"
        })"_json;

        event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$15105042942524OGmZm:kamax.io");
        EXPECT_EQ(event.room_id, "!cURbafjkfsMDVwdRDQ:matrix.org");
        EXPECT_EQ(event.sender, "@max:kamax.io");
        EXPECT_EQ(event.origin_server_ts, 1510504294993L);
        EXPECT_EQ(event.unsigned_data.age, 738977);

        EXPECT_EQ(event.content.body, "image.png");
        EXPECT_EQ(event.content.info.mimetype, "image/png");
        EXPECT_EQ(event.content.info.h, 0);
        EXPECT_EQ(event.content.info.w, 0);
        EXPECT_EQ(event.content.info.size, 0);
        EXPECT_EQ(event.content.info.thumbnail_url, "mxc://kamax.io/IlTRDmpGMPkiwlyYUpHXSqjH");
        EXPECT_EQ(event.content.info.thumbnail_info.mimetype, "image/png");
        EXPECT_EQ(event.content.info.thumbnail_info.w, 0);
        EXPECT_EQ(event.content.info.thumbnail_info.h, 0);
        EXPECT_EQ(event.content.info.thumbnail_info.size, 0);
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");
}

TEST(RoomEvents, LocationMessage) {}

TEST(RoomEvents, NoticeMessage)
{
        json data = R"({
          "origin_server_ts": 1510435865515,
          "sender": "@_neb_github:matrix.org",
          "event_id": "$15104358652239178iCnZy:matrix.org",
          "unsigned": {
            "age": 69168455
          },
          "content": {
            "body": "https://github.com/postmarketOS/pmbootstrap/issues/900 : Package nheko",
            "msgtype": "m.notice",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "type": "m.room.message",
          "room_id": "!BPvgRcBVHzyFSlYkrg:matrix.org"
        })"_json;

        RoomEvent<msg::Notice> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$15104358652239178iCnZy:matrix.org");
        EXPECT_EQ(event.room_id, "!BPvgRcBVHzyFSlYkrg:matrix.org");
        EXPECT_EQ(event.sender, "@_neb_github:matrix.org");
        EXPECT_EQ(event.origin_server_ts, 1510435865515L);
        EXPECT_EQ(event.unsigned_data.age, 69168455);
        EXPECT_EQ(event.content.body,
                  "https://github.com/postmarketOS/pmbootstrap/issues/900 : Package nheko");
        EXPECT_EQ(event.content.msgtype, "m.notice");
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");
}

TEST(RoomEvents, TextMessage)
{
        json data = R"({
          "origin_server_ts": 1510489356530,
          "sender": "@nheko_test:matrix.org",
          "event_id": "$15104893562785758wEgEU:matrix.org",
          "unsigned": {
            "age": 2225,
            "transaction_id": "m1510489356267.2"
          },
          "content": {
            "body": "hey there",
            "msgtype": "m.text",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "type": "m.room.message",
          "room_id": "!lfoDRlNFWlvOnvkBwQ:matrix.org"
         })"_json;

        RoomEvent<msg::Text> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$15104893562785758wEgEU:matrix.org");
        EXPECT_EQ(event.room_id, "!lfoDRlNFWlvOnvkBwQ:matrix.org");
        EXPECT_EQ(event.sender, "@nheko_test:matrix.org");
        EXPECT_EQ(event.origin_server_ts, 1510489356530L);
        EXPECT_EQ(event.unsigned_data.age, 2225);
        EXPECT_EQ(event.unsigned_data.transaction_id, "m1510489356267.2");

        EXPECT_EQ(event.content.body, "hey there");
        EXPECT_EQ(event.content.msgtype, "m.text");
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");

        EXPECT_EQ(data.dump(), json(event).dump());
}

TEST(RoomEvents, VideoMessage)
{
        json data = R"({
	  "unsigned": {
            "age": 146
	  },
          "content": {
              "body": "Gangnam Style",
              "info": {
                  "duration": 2140786,
                  "mimetype": "video/mp4",
                  "size": 1563685,
		  "h": 320,
		  "w": 480,
		  "thumbnail_url": "mxc://localhost/FHyPlCeYUSFFxlgbQYZmoEoe",
		  "thumbnail_info": {
		    "h": 300,
		    "mimetype": "image/jpeg",
		    "size": 46144,
		    "w": 310
		  }
              },
              "msgtype": "m.video",
              "url": "mxc://localhost/ffed755USFFxlgbQYZGtryd",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "event_id": "$143273582443PhrSn:localhost",
          "origin_server_ts": 1432735824653,
          "room_id": "!jEsUZKDJdhlrceRyVU:localhost",
          "sender": "@example:localhost",
          "type": "m.room.message"
        })"_json;

        RoomEvent<msg::Video> event = data;

        EXPECT_EQ(event.type, EventType::RoomMessage);
        EXPECT_EQ(event.event_id, "$143273582443PhrSn:localhost");
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:localhost");
        EXPECT_EQ(event.sender, "@example:localhost");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.unsigned_data.age, 146);

        EXPECT_EQ(event.content.body, "Gangnam Style");
        EXPECT_EQ(event.content.msgtype, "m.video");
        EXPECT_EQ(event.content.url, "mxc://localhost/ffed755USFFxlgbQYZGtryd");
        EXPECT_EQ(event.content.info.mimetype, "video/mp4");
        EXPECT_EQ(event.content.info.w, 480);
        EXPECT_EQ(event.content.info.h, 320);
        EXPECT_EQ(event.content.info.size, 1563685);
        EXPECT_EQ(event.content.info.duration, 2140786);
        EXPECT_EQ(event.content.info.thumbnail_info.h, 300);
        EXPECT_EQ(event.content.info.thumbnail_info.w, 310);
        EXPECT_EQ(event.content.info.thumbnail_info.size, 46144);
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");
}

TEST(RoomEvents, Sticker)
{
        json data = R"({
          "age": 242352,
          "content": {
            "body": "Landing",
            "info": {
              "h": 200,
              "mimetype": "image/png",
	      "size": 73602,
	      "thumbnail_info": {
                "h": 200,
                "mimetype": "image/png",
                "size": 73602,
                "w": 140
              },
              "thumbnail_url": "mxc://matrix.org/sHhqkFCvSkFwtmvtETOtKnLP",
              "w": 140
            },
            "url": "mxc://matrix.org/sHhqkFCvSkFwtmvtETOtKnLP",
	      "m.relates_to": {
		  "m.in_reply_to": {
                       "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                  }
              }
          },
          "event_id": "$WLGTSEFSEF:localhost",
          "origin_server_ts": 1431961217939,
          "room_id": "!Cuyf34gef24t:localhost",
          "sender": "@example:localhost",
          "type": "m.sticker"
	})"_json;

        Sticker event = data;

        EXPECT_EQ(event.type, EventType::Sticker);
        EXPECT_EQ(event.event_id, "$WLGTSEFSEF:localhost");
        EXPECT_EQ(event.content.body, "Landing");
        EXPECT_EQ(event.content.url, "mxc://matrix.org/sHhqkFCvSkFwtmvtETOtKnLP");
        EXPECT_EQ(event.content.info.w, 140);
        EXPECT_EQ(event.content.info.h, 200);
        EXPECT_EQ(event.content.info.size, 73602);
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");

        json data2     = R"({
	  "type": "m.sticker",
	  "sender": "masked",
	  "content": {
	    "msgtype": "m.sticker",
	    "url": "mxc://devture.com/OCPxxxxxxxxxxxxxxxx",
	    "info": {
	      "mimetype": "image/png",
	      "size": 16901,
	      "h": 240,
	      "w": 240
	    }
	  },
	  "origin_server_ts": 1586985031228,
	  "unsigned": {
	    "age": 38
	  },
	  "event_id": "masked",
	  "room_id": "!masked:devture.com"
	})"_json;
        Sticker event2 = data2;
        EXPECT_EQ(event2.type, EventType::Sticker);
        EXPECT_EQ(event2.content.body, "");
        EXPECT_EQ(event2.content.url, "mxc://devture.com/OCPxxxxxxxxxxxxxxxx");
        EXPECT_EQ(event2.content.info.w, 240);
        EXPECT_EQ(event2.content.info.h, 240);
        EXPECT_EQ(event2.content.info.size, 16901);
}

TEST(FormattedMessages, Deserialization)
{
        json notice_data = R"({
          "origin_server_ts": 1510435865515,
          "sender": "@_neb_github:matrix.org",
          "event_id": "$15104358652239178iCnZy:matrix.org",
          "content": {
            "body": "https://github.com/postmarketOS/pmbootstrap/issues/900 : Package nheko",
            "msgtype": "m.notice",
            "format": "org.matrix.custom.html",
            "formatted_body": "<h1> Hello World! </h1>"
          },
          "type": "m.room.message",
          "room_id": "!BPvgRcBVHzyFSlYkrg:matrix.org"
        })"_json;

        RoomEvent<msg::Notice> notice = notice_data;

        EXPECT_EQ(notice.type, EventType::RoomMessage);
        EXPECT_EQ(notice.content.msgtype, "m.notice");
        EXPECT_EQ(notice.content.format, "org.matrix.custom.html");
        EXPECT_EQ(notice.content.formatted_body, "<h1> Hello World! </h1>");

        json text_data = R"({
          "origin_server_ts": 1510489356530,
          "sender": "@nheko_test:matrix.org",
          "event_id": "$15104893562785758wEgEU:matrix.org",
          "content": {
            "body": "hey there",
            "msgtype": "m.text",
            "format": "org.matrix.custom.html",
            "formatted_body": "<h1> Hello World! </h1>"
          },
          "type": "m.room.message",
          "room_id": "!lfoDRlNFWlvOnvkBwQ:matrix.org"
         })"_json;

        RoomEvent<msg::Text> text = text_data;

        EXPECT_EQ(text.content.msgtype, "m.text");
        EXPECT_EQ(text.content.format, "org.matrix.custom.html");
        EXPECT_EQ(text.content.formatted_body, "<h1> Hello World! </h1>");

        json emote_data = R"({
          "origin_server_ts": 1509878682149,
          "sender": "@mujx:matrix.org",
          "event_id": "$15098786822025533uttji:matrix.org",
          "content": {
            "body": "tests",
            "msgtype": "m.emote",
            "format": "org.matrix.custom.html",
            "formatted_body": "<h1> Hello World! </h1>"
          },
          "type": "m.room.message",
          "room_id": "!VaMCVKSVcyPtXbcMXh:matrix.org"
        })"_json;

        RoomEvent<msg::Emote> emote = emote_data;

        EXPECT_EQ(emote.content.msgtype, "m.emote");
        EXPECT_EQ(emote.content.format, "org.matrix.custom.html");
        EXPECT_EQ(emote.content.formatted_body, "<h1> Hello World! </h1>");
}
TEST(RoomEvents, Encrypted)
{
        json data = R"({
	    "content": {
		"algorithm": "m.megolm.v1.aes-sha2",
		"ciphertext": "AwgAEnACgAkLmt6qF84IK++J7UDH2Za1YVchHyprqTqsg...",
		"device_id": "RJYKSTBOIE",
		"sender_key": "IlRMeOPX2e0MurIyfWEucYBRVOEEUMrOHqn/8mLqMjA",
		"session_id": "X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ",
	        "m.relates_to": {
		    "m.in_reply_to": {
                         "event_id": "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E"
                    }
                }
	    },
	    "event_id": "$143273582443PhrSn:example.org",
	    "origin_server_ts": 1432735824653,
	    "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
	    "sender": "@example:example.org",
	    "type": "m.room.encrypted",
	    "unsigned": {
		"age": 1234
	    }
	})"_json;

        RoomEvent<msg::Encrypted> event = data;

        EXPECT_EQ(event.type, EventType::RoomEncrypted);
        EXPECT_EQ(event.event_id, "$143273582443PhrSn:example.org");
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:example.org");
        EXPECT_EQ(event.sender, "@example:example.org");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.unsigned_data.age, 1234);
        EXPECT_EQ(event.content.algorithm, "m.megolm.v1.aes-sha2");
        EXPECT_EQ(event.content.ciphertext, "AwgAEnACgAkLmt6qF84IK++J7UDH2Za1YVchHyprqTqsg...");
        EXPECT_EQ(event.content.device_id, "RJYKSTBOIE");
        EXPECT_EQ(event.content.sender_key, "IlRMeOPX2e0MurIyfWEucYBRVOEEUMrOHqn/8mLqMjA");
        EXPECT_EQ(event.content.session_id, "X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ");
        EXPECT_EQ(event.content.relates_to.in_reply_to.event_id,
                  "$6GKhAfJOcwNd69lgSizdcTob8z2pWQgBOZPrnsWMA1E");

        EXPECT_EQ(data, json(event));
}

TEST(RoomEvents, CallInvite)
{
        nlohmann::json data = R"({
          "content": {
            "call_id": "c1591052749788",
            "offer": {
              "sdp": "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]",
              "type": "offer"
            },
            "version": 0,
            "lifetime": 120000
          },
          "event_id": "$143273582443PhrSn:example.org",
          "origin_server_ts": 1432735824653,
          "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
          "sender": "@example:example.org",
          "type": "m.call.invite",
          "unsigned": {
            "age": 1234
          }
        })"_json;

        RoomEvent<msg::CallInvite> event = data;

        EXPECT_EQ(event.event_id, "$143273582443PhrSn:example.org");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:example.org");
        EXPECT_EQ(event.sender, "@example:example.org");
        EXPECT_EQ(event.type, EventType::CallInvite);
        EXPECT_EQ(event.unsigned_data.age, 1234);
        EXPECT_EQ(event.content.call_id, "c1591052749788");
        EXPECT_EQ(event.content.sdp, "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]");
        EXPECT_EQ(event.content.version, 0);
        EXPECT_EQ(event.content.lifetime, 120000);

        EXPECT_EQ(data, json(event));
}

TEST(RoomEvents, CallCandidates)
{
        nlohmann::json data = R"({
          "content": {
            "call_id": "c1591052749788",
            "candidates": [
              {
                "sdpMid": "audio",
                "sdpMLineIndex": 0,
                "candidate": "candidate:863018703 1 udp 2122260223 10.9.64.156 43670 typ host generation 0"
              }
            ],
            "version": 0
          },
          "event_id": "$143273582443PhrSn:example.org",
          "origin_server_ts": 1432735824653,
          "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
          "sender": "@example:example.org",
          "type": "m.call.candidates",
          "unsigned": {
            "age": 1234
          }
        })"_json;

        RoomEvent<msg::CallCandidates> event = data;

        EXPECT_EQ(event.event_id, "$143273582443PhrSn:example.org");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:example.org");
        EXPECT_EQ(event.sender, "@example:example.org");
        EXPECT_EQ(event.type, EventType::CallCandidates);
        EXPECT_EQ(event.unsigned_data.age, 1234);
        EXPECT_EQ(event.content.call_id, "c1591052749788");
        EXPECT_EQ(event.content.candidates[0].sdpMid, "audio");
        EXPECT_EQ(event.content.candidates[0].sdpMLineIndex, 0);
        EXPECT_EQ(event.content.candidates[0].candidate,
                  "candidate:863018703 1 udp 2122260223 10.9.64.156 43670 typ host generation 0");
        EXPECT_EQ(event.content.version, 0);

        EXPECT_EQ(data, json(event));
}

TEST(RoomEvents, CallAnswer)
{
        nlohmann::json data = R"({
          "content": {
            "call_id": "c1591052749788",
            "answer": {
              "sdp": "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]",
              "type": "answer"
            },
            "version": 0
          },
          "event_id": "$143273582443PhrSn:example.org",
          "origin_server_ts": 1432735824653,
          "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
          "sender": "@example:example.org",
          "type": "m.call.answer",
          "unsigned": {
            "age": 1234
          }
        })"_json;

        RoomEvent<msg::CallAnswer> event = data;

        EXPECT_EQ(event.event_id, "$143273582443PhrSn:example.org");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:example.org");
        EXPECT_EQ(event.sender, "@example:example.org");
        EXPECT_EQ(event.type, EventType::CallAnswer);
        EXPECT_EQ(event.unsigned_data.age, 1234);
        EXPECT_EQ(event.content.call_id, "c1591052749788");
        EXPECT_EQ(event.content.sdp, "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]");
        EXPECT_EQ(event.content.version, 0);

        EXPECT_EQ(data, json(event));
}

TEST(RoomEvents, CallHangUp)
{
        nlohmann::json data = R"({
          "content": {
            "call_id": "c1591052749788",
            "version": 0,
            "reason": "invite_timeout"
          },
          "event_id": "$143273582443PhrSn:example.org",
          "origin_server_ts": 1432735824653,
          "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
          "sender": "@example:example.org",
          "type": "m.call.hangup",
          "unsigned": {
            "age": 1234
          }
        })"_json;

        RoomEvent<msg::CallHangUp> event = data;

        EXPECT_EQ(event.event_id, "$143273582443PhrSn:example.org");
        EXPECT_EQ(event.origin_server_ts, 1432735824653L);
        EXPECT_EQ(event.room_id, "!jEsUZKDJdhlrceRyVU:example.org");
        EXPECT_EQ(event.sender, "@example:example.org");
        EXPECT_EQ(event.type, EventType::CallHangUp);
        EXPECT_EQ(event.unsigned_data.age, 1234);
        EXPECT_EQ(event.content.call_id, "c1591052749788");
        EXPECT_EQ(event.content.version, 0);
        EXPECT_EQ(event.content.reason, msg::CallHangUp::Reason::InviteTimeOut);

        EXPECT_EQ(data, json(event));
}