def handle(self, *args: Any, **options: Any) -> None:
        output_dir = options["output_dir"]
        if output_dir is None:
            print("You need to specify --output <output directory>")
            exit(1)

        if os.path.exists(output_dir) and not os.path.isdir(output_dir):
            print(output_dir + " is not a directory")
            exit(1)

        os.makedirs(output_dir, exist_ok=True)

        if os.listdir(output_dir):
            print('Output directory should be empty!')
            exit(1)
        output_dir = os.path.realpath(output_dir)

        data_dir = options['mattermost_data_dir']
        if not os.path.exists(data_dir):
            print("Directory not found: '%s'" % (data_dir, ))
            exit(1)
        data_dir = os.path.realpath(data_dir)

        print("Converting Data ...")
        do_convert_data(
            mattermost_data_dir=data_dir,
            output_dir=output_dir,
            masking_content=options.get('masking_content', False),
        )
    def test_do_convert_data_with_masking(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch("builtins.print") as mock_print, self.assertLogs(
                level="WARNING") as warn_log:
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=True,
            )
        self.assertEqual(
            mock_print.mock_calls,
            [
                call("Generating data for", "gryffindor"),
                call("Generating data for", "slytherin")
            ],
        )
        self.assertEqual(
            warn_log.output,
            [
                "WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export",
                "WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export",
            ],
        )

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        messages = self.read_file(harry_team_output_dir,
                                  "messages-000001.json")

        self.assertIn(messages["zerver_message"][0]["content"],
                      "xxxxx xxxxxx xxx xxxxxxx.\n\n")
Example #3
0
    def test_import_data_to_existing_database(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch('builtins.print') as mock_print, self.assertLogs(level='WARNING') as warn_log:
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=True,
            )
        self.assertEqual(mock_print.mock_calls, [
            call('Generating data for', 'gryffindor'),
            call('Generating data for', 'slytherin')
        ])
        self.assertEqual(warn_log.output, [
            'WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export',
            'WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export',
        ])

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")

        with self.assertLogs(level="INFO"):
            do_import_realm(
                import_dir=harry_team_output_dir,
                subdomain='gryffindor',
            )

        realm = get_realm('gryffindor')

        realm_users = UserProfile.objects.filter(realm=realm)
        messages = Message.objects.filter(sender__in=realm_users)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)
    def test_do_convert_data_with_masking(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch('builtins.print') as mock_print, self.assertLogs(
                level='WARNING') as warn_log:
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=True,
            )
        self.assertEqual(mock_print.mock_calls, [
            call('Generating data for', 'gryffindor'),
            call('Generating data for', 'slytherin')
        ])
        self.assertEqual(warn_log.output, [
            'WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export',
            'WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export',
        ])

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        messages = self.read_file(harry_team_output_dir,
                                  'messages-000001.json')

        self.assertIn(messages['zerver_message'][0]['content'],
                      'xxxxx xxxxxx xxx xxxxxxx.\n\n')
Example #5
0
    def handle(self, *args: Any, **options: Any) -> None:
        output_dir = options["output_dir"]
        if output_dir is None:
            raise CommandError(
                "You need to specify --output <output directory>")

        if os.path.exists(output_dir) and not os.path.isdir(output_dir):
            raise CommandError(output_dir + " is not a directory")

        os.makedirs(output_dir, exist_ok=True)

        if os.listdir(output_dir):
            raise CommandError("Output directory should be empty!")
        output_dir = os.path.realpath(output_dir)

        data_dir = options["mattermost_data_dir"]
        if not os.path.exists(data_dir):
            raise CommandError(f"Directory not found: '{data_dir}'")
        data_dir = os.path.realpath(data_dir)

        print("Converting data ...")
        do_convert_data(
            mattermost_data_dir=data_dir,
            output_dir=output_dir,
            masking_content=options.get("masking_content", False),
        )
    def test_import_data_to_existing_database(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch('builtins.print') as mock_print:
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=True,
            )
        self.assertEqual(mock_print.mock_calls, [
            call('Generating data for', 'gryffindor'),
            call('Generating data for', 'slytherin')
        ])

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")

        do_import_realm(
            import_dir=harry_team_output_dir,
            subdomain='gryffindor',
        )
        realm = get_realm('gryffindor')

        realm_users = UserProfile.objects.filter(realm=realm)
        messages = Message.objects.filter(sender__in=realm_users)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)
    def test_do_convert_data_with_masking(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        do_convert_data(mattermost_data_dir=mattermost_data_dir,
                        output_dir=output_dir,
                        masking_content=True)

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        messages = self.read_file(harry_team_output_dir,
                                  'messages-000001.json')

        self.assertIn(messages['zerver_message'][0]['content'],
                      'xxxxx xxxxxx xxx xxxxxxx.\n\n')
    def test_import_data_to_existing_database(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        do_convert_data(mattermost_data_dir=mattermost_data_dir,
                        output_dir=output_dir,
                        masking_content=True)

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")

        do_import_realm(import_dir=harry_team_output_dir,
                        subdomain='gryffindor')
        realm = get_realm('gryffindor')

        realm_users = UserProfile.objects.filter(realm=realm)
        messages = Message.objects.filter(sender__in=realm_users)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)
    def test_do_convert_data_with_masking(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch('builtins.print') as mock_print:
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=True,
            )
        self.assertEqual(mock_print.mock_calls, [
            call('Generating data for', 'gryffindor'),
            call('Generating data for', 'slytherin')
        ])

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        messages = self.read_file(harry_team_output_dir,
                                  'messages-000001.json')

        self.assertIn(messages['zerver_message'][0]['content'],
                      'xxxxx xxxxxx xxx xxxxxxx.\n\n')
Example #10
0
    def test_do_convert_data_with_direct_messages(self) -> None:
        mattermost_data_dir = self.fixture_file_name("direct_channel", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch('builtins.print') as mock_print, self.assertLogs(level="INFO"):
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=False,
            )
        self.assertEqual(mock_print.mock_calls, [
            call('Generating data for', 'gryffindor'),
        ])

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        self.assertEqual(os.path.exists(os.path.join(harry_team_output_dir, 'avatars')), True)
        self.assertEqual(os.path.exists(os.path.join(harry_team_output_dir, 'emoji')), True)
        self.assertEqual(os.path.exists(os.path.join(harry_team_output_dir, 'attachment.json')), True)

        realm = self.read_file(harry_team_output_dir, 'realm.json')

        self.assertEqual('Organization imported from Mattermost!',
                         realm['zerver_realm'][0]['description'])

        exported_user_ids = self.get_set(realm['zerver_userprofile'], 'id')
        exported_user_full_names = self.get_set(realm['zerver_userprofile'], 'full_name')
        self.assertEqual({'Harry Potter', 'Ron Weasley', 'Ginny Weasley', 'Tom Riddle'}, exported_user_full_names)

        exported_user_emails = self.get_set(realm['zerver_userprofile'], 'email')
        self.assertEqual({'*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**'}, exported_user_emails)

        self.assertEqual(len(realm['zerver_stream']), 3)
        exported_stream_names = self.get_set(realm['zerver_stream'], 'name')
        self.assertEqual(exported_stream_names, {'Gryffindor common room', 'Gryffindor quidditch team', 'Dumbledores army'})
        self.assertEqual(self.get_set(realm['zerver_stream'], 'realm'), {realm['zerver_realm'][0]['id']})
        self.assertEqual(self.get_set(realm['zerver_stream'], 'deactivated'), {False})

        self.assertEqual(len(realm['zerver_defaultstream']), 0)

        exported_recipient_ids = self.get_set(realm['zerver_recipient'], 'id')
        self.assertEqual(len(exported_recipient_ids), 8)
        exported_recipient_types = self.get_set(realm['zerver_recipient'], 'type')
        self.assertEqual(exported_recipient_types, {1, 2, 3})
        exported_recipient_type_ids = self.get_set(realm['zerver_recipient'], 'type_id')
        self.assertEqual(len(exported_recipient_type_ids), 4)

        exported_subscription_userprofile = self.get_set(realm['zerver_subscription'], 'user_profile')
        self.assertEqual(len(exported_subscription_userprofile), 4)
        exported_subscription_recipients = self.get_set(realm['zerver_subscription'], 'recipient')
        self.assertEqual(len(exported_subscription_recipients), 8)

        messages = self.read_file(harry_team_output_dir, 'messages-000001.json')

        exported_messages_id = self.get_set(messages['zerver_message'], 'id')
        self.assertIn(messages['zerver_message'][0]['sender'], exported_user_ids)
        self.assertIn(messages['zerver_message'][0]['recipient'], exported_recipient_ids)
        self.assertIn(messages['zerver_message'][0]['content'], 'ron joined the channel.\n\n')

        exported_usermessage_userprofiles = self.get_set(messages['zerver_usermessage'], 'user_profile')
        self.assertEqual(len(exported_usermessage_userprofiles), 3)
        exported_usermessage_messages = self.get_set(messages['zerver_usermessage'], 'message')
        self.assertEqual(exported_usermessage_messages, exported_messages_id)

        with self.assertLogs(level="INFO"):
            do_import_realm(
                import_dir=harry_team_output_dir,
                subdomain='gryffindor',
            )

        realm = get_realm('gryffindor')

        messages = Message.objects.filter(sender__realm=realm)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)
        self.assertEqual(len(messages), 11)

        stream_messages = messages.filter(recipient__type=Recipient.STREAM).order_by("date_sent")
        stream_recipients = stream_messages.values_list("recipient", flat=True)
        self.assertEqual(len(stream_messages), 4)
        self.assertEqual(len(set(stream_recipients)), 2)
        self.assertEqual(stream_messages[0].sender.email, "*****@*****.**")
        self.assertEqual(stream_messages[0].content, "ron joined the channel.\n\n")

        huddle_messages = messages.filter(recipient__type=Recipient.HUDDLE).order_by("date_sent")
        huddle_recipients = huddle_messages.values_list("recipient", flat=True)
        self.assertEqual(len(huddle_messages), 3)
        self.assertEqual(len(set(huddle_recipients)), 1)
        self.assertEqual(huddle_messages[0].sender.email, "*****@*****.**")
        self.assertEqual(huddle_messages[0].content, "Who is going to Hogesmead this weekend?\n\n")

        personal_messages = messages.filter(recipient__type=Recipient.PERSONAL).order_by("date_sent")
        personal_recipients = personal_messages.values_list("recipient", flat=True)
        self.assertEqual(len(personal_messages), 4)
        self.assertEqual(len(set(personal_recipients)), 3)
        self.assertEqual(personal_messages[0].sender.email, "*****@*****.**")
        self.assertEqual(personal_messages[0].content, "hey harry\n\n")
Example #11
0
    def test_do_convert_data(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch('builtins.print') as mock_print, self.assertLogs(level='WARNING') as warn_log:
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=False,
            )
        self.assertEqual(mock_print.mock_calls, [
            call('Generating data for', 'gryffindor'),
            call('Generating data for', 'slytherin')
        ])
        self.assertEqual(warn_log.output, [
            'WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export',
            'WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export',
        ])

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        self.assertEqual(os.path.exists(os.path.join(harry_team_output_dir, 'avatars')), True)
        self.assertEqual(os.path.exists(os.path.join(harry_team_output_dir, 'emoji')), True)
        self.assertEqual(os.path.exists(os.path.join(harry_team_output_dir, 'attachment.json')), True)

        realm = self.read_file(harry_team_output_dir, 'realm.json')

        self.assertEqual('Organization imported from Mattermost!',
                         realm['zerver_realm'][0]['description'])

        exported_user_ids = self.get_set(realm['zerver_userprofile'], 'id')
        exported_user_full_names = self.get_set(realm['zerver_userprofile'], 'full_name')
        self.assertEqual({'Harry Potter', 'Ron Weasley', 'Severus Snape'}, exported_user_full_names)

        exported_user_emails = self.get_set(realm['zerver_userprofile'], 'email')
        self.assertEqual({'*****@*****.**', '*****@*****.**', '*****@*****.**'}, exported_user_emails)

        self.assertEqual(len(realm['zerver_stream']), 3)
        exported_stream_names = self.get_set(realm['zerver_stream'], 'name')
        self.assertEqual(exported_stream_names, {'Gryffindor common room', 'Gryffindor quidditch team', 'Dumbledores army'})
        self.assertEqual(self.get_set(realm['zerver_stream'], 'realm'), {realm['zerver_realm'][0]['id']})
        self.assertEqual(self.get_set(realm['zerver_stream'], 'deactivated'), {False})

        self.assertEqual(len(realm['zerver_defaultstream']), 0)

        exported_recipient_ids = self.get_set(realm['zerver_recipient'], 'id')
        self.assertEqual(len(exported_recipient_ids), 6)
        exported_recipient_types = self.get_set(realm['zerver_recipient'], 'type')
        self.assertEqual(exported_recipient_types, {1, 2})
        exported_recipient_type_ids = self.get_set(realm['zerver_recipient'], 'type_id')
        self.assertEqual(len(exported_recipient_type_ids), 3)

        exported_subscription_userprofile = self.get_set(realm['zerver_subscription'], 'user_profile')
        self.assertEqual(len(exported_subscription_userprofile), 3)
        exported_subscription_recipients = self.get_set(realm['zerver_subscription'], 'recipient')
        self.assertEqual(len(exported_subscription_recipients), 6)

        messages = self.read_file(harry_team_output_dir, 'messages-000001.json')

        exported_messages_id = self.get_set(messages['zerver_message'], 'id')
        self.assertIn(messages['zerver_message'][0]['sender'], exported_user_ids)
        self.assertIn(messages['zerver_message'][0]['recipient'], exported_recipient_ids)
        self.assertIn(messages['zerver_message'][0]['content'], 'harry joined the channel.\n\n')

        exported_usermessage_userprofiles = self.get_set(messages['zerver_usermessage'], 'user_profile')
        self.assertEqual(len(exported_usermessage_userprofiles), 3)
        exported_usermessage_messages = self.get_set(messages['zerver_usermessage'], 'message')
        self.assertEqual(exported_usermessage_messages, exported_messages_id)

        with self.assertLogs(level="INFO"):
            do_import_realm(
                import_dir=harry_team_output_dir,
                subdomain='gryffindor',
            )

        realm = get_realm('gryffindor')

        self.assertFalse(get_user("*****@*****.**", realm).is_mirror_dummy)
        self.assertFalse(get_user("*****@*****.**", realm).is_mirror_dummy)
        self.assertTrue(get_user("*****@*****.**", realm).is_mirror_dummy)

        messages = Message.objects.filter(sender__realm=realm)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)
    def test_do_convert_data_with_direct_messages(self) -> None:
        mattermost_data_dir = self.fixture_file_name("direct_channel",
                                                     "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch("builtins.print") as mock_print, self.assertLogs(
                level="INFO"):
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=False,
            )
        self.assertEqual(
            mock_print.mock_calls,
            [
                call("Generating data for", "gryffindor"),
            ],
        )

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        self.assertEqual(
            os.path.exists(os.path.join(harry_team_output_dir, "avatars")),
            True)
        self.assertEqual(
            os.path.exists(os.path.join(harry_team_output_dir, "emoji")), True)
        self.assertEqual(
            os.path.exists(os.path.join(harry_team_output_dir, "uploads")),
            True)
        self.assertEqual(
            os.path.exists(
                os.path.join(harry_team_output_dir, "attachment.json")), True)

        realm = self.read_file(harry_team_output_dir, "realm.json")

        self.assertEqual("Organization imported from Mattermost!",
                         realm["zerver_realm"][0]["description"])

        exported_user_ids = self.get_set(realm["zerver_userprofile"], "id")
        exported_user_full_names = self.get_set(realm["zerver_userprofile"],
                                                "full_name")
        self.assertEqual(
            {"Harry Potter", "Ron Weasley", "Ginny Weasley", "Tom Riddle"},
            exported_user_full_names)

        exported_user_emails = self.get_set(realm["zerver_userprofile"],
                                            "email")
        self.assertEqual(
            {
                "*****@*****.**", "*****@*****.**", "*****@*****.**",
                "*****@*****.**"
            },
            exported_user_emails,
        )

        self.assert_length(realm["zerver_stream"], 3)
        exported_stream_names = self.get_set(realm["zerver_stream"], "name")
        self.assertEqual(
            exported_stream_names,
            {
                "Gryffindor common room", "Gryffindor quidditch team",
                "Dumbledores army"
            },
        )
        self.assertEqual(self.get_set(realm["zerver_stream"], "realm"),
                         {realm["zerver_realm"][0]["id"]})
        self.assertEqual(self.get_set(realm["zerver_stream"], "deactivated"),
                         {False})

        self.assert_length(realm["zerver_defaultstream"], 0)

        exported_recipient_ids = self.get_set(realm["zerver_recipient"], "id")
        self.assert_length(exported_recipient_ids, 8)
        exported_recipient_types = self.get_set(realm["zerver_recipient"],
                                                "type")
        self.assertEqual(exported_recipient_types, {1, 2, 3})
        exported_recipient_type_ids = self.get_set(realm["zerver_recipient"],
                                                   "type_id")
        self.assert_length(exported_recipient_type_ids, 4)

        exported_subscription_userprofile = self.get_set(
            realm["zerver_subscription"], "user_profile")
        self.assert_length(exported_subscription_userprofile, 4)
        exported_subscription_recipients = self.get_set(
            realm["zerver_subscription"], "recipient")
        self.assert_length(exported_subscription_recipients, 8)

        messages = self.read_file(harry_team_output_dir,
                                  "messages-000001.json")

        exported_messages_id = self.get_set(messages["zerver_message"], "id")
        self.assertIn(messages["zerver_message"][0]["sender"],
                      exported_user_ids)
        self.assertIn(messages["zerver_message"][0]["recipient"],
                      exported_recipient_ids)
        self.assertIn(messages["zerver_message"][0]["content"],
                      "ron joined the channel.\n\n")

        exported_usermessage_userprofiles = self.get_set(
            messages["zerver_usermessage"], "user_profile")
        self.assert_length(exported_usermessage_userprofiles, 3)
        exported_usermessage_messages = self.get_set(
            messages["zerver_usermessage"], "message")
        self.assertEqual(exported_usermessage_messages, exported_messages_id)

        with self.assertLogs(level="INFO"):
            do_import_realm(
                import_dir=harry_team_output_dir,
                subdomain="gryffindor",
            )

        realm = get_realm("gryffindor")

        messages = Message.objects.filter(sender__realm=realm)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)
        self.assert_length(messages, 11)

        stream_messages = messages.filter(
            recipient__type=Recipient.STREAM).order_by("date_sent")
        stream_recipients = stream_messages.values_list("recipient", flat=True)
        self.assert_length(stream_messages, 4)
        self.assert_length(set(stream_recipients), 2)
        self.assertEqual(stream_messages[0].sender.email, "*****@*****.**")
        self.assertEqual(stream_messages[0].content,
                         "ron joined the channel.\n\n")

        self.assertEqual(stream_messages[3].sender.email, "*****@*****.**")
        self.assertRegex(
            stream_messages[3].content,
            "Looks like this channel is empty\n\n\\[this is a file\\]\\(.*\\)",
        )
        self.assertTrue(stream_messages[3].has_attachment)
        self.assertFalse(stream_messages[3].has_image)
        self.assertTrue(stream_messages[3].has_link)

        huddle_messages = messages.filter(
            recipient__type=Recipient.HUDDLE).order_by("date_sent")
        huddle_recipients = huddle_messages.values_list("recipient", flat=True)
        self.assert_length(huddle_messages, 3)
        self.assert_length(set(huddle_recipients), 1)
        self.assertEqual(huddle_messages[0].sender.email, "*****@*****.**")
        self.assertEqual(huddle_messages[0].content,
                         "Who is going to Hogsmeade this weekend?\n\n")

        personal_messages = messages.filter(
            recipient__type=Recipient.PERSONAL).order_by("date_sent")
        personal_recipients = personal_messages.values_list("recipient",
                                                            flat=True)
        self.assert_length(personal_messages, 4)
        self.assert_length(set(personal_recipients), 3)
        self.assertEqual(personal_messages[0].sender.email, "*****@*****.**")
        self.assertRegex(personal_messages[0].content,
                         "hey harry\n\n\\[harry-ron.jpg\\]\\(.*\\)")
        self.assertTrue(personal_messages[0].has_attachment)
        self.assertTrue(personal_messages[0].has_image)
        self.assertTrue(personal_messages[0].has_link)
    def test_do_convert_data(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        with patch("builtins.print") as mock_print, self.assertLogs(
                level="WARNING") as warn_log:
            do_convert_data(
                mattermost_data_dir=mattermost_data_dir,
                output_dir=output_dir,
                masking_content=False,
            )
        self.assertEqual(
            mock_print.mock_calls,
            [
                call("Generating data for", "gryffindor"),
                call("Generating data for", "slytherin")
            ],
        )
        self.assertEqual(
            warn_log.output,
            [
                "WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export",
                "WARNING:root:Skipping importing huddles and PMs since there are multiple teams in the export",
            ],
        )

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        self.assertEqual(
            os.path.exists(os.path.join(harry_team_output_dir, "avatars")),
            True)
        self.assertEqual(
            os.path.exists(os.path.join(harry_team_output_dir, "emoji")), True)
        self.assertEqual(
            os.path.exists(
                os.path.join(harry_team_output_dir, "attachment.json")), True)

        realm = self.read_file(harry_team_output_dir, "realm.json")

        self.assertEqual("Organization imported from Mattermost!",
                         realm["zerver_realm"][0]["description"])

        exported_user_ids = self.get_set(realm["zerver_userprofile"], "id")
        exported_user_full_names = self.get_set(realm["zerver_userprofile"],
                                                "full_name")
        self.assertEqual({"Harry Potter", "Ron Weasley", "Severus Snape"},
                         exported_user_full_names)

        exported_user_emails = self.get_set(realm["zerver_userprofile"],
                                            "email")
        self.assertEqual(
            {"*****@*****.**", "*****@*****.**", "*****@*****.**"},
            exported_user_emails)

        self.assert_length(realm["zerver_stream"], 3)
        exported_stream_names = self.get_set(realm["zerver_stream"], "name")
        self.assertEqual(
            exported_stream_names,
            {
                "Gryffindor common room", "Gryffindor quidditch team",
                "Dumbledores army"
            },
        )
        self.assertEqual(self.get_set(realm["zerver_stream"], "realm"),
                         {realm["zerver_realm"][0]["id"]})
        self.assertEqual(self.get_set(realm["zerver_stream"], "deactivated"),
                         {False})

        self.assert_length(realm["zerver_defaultstream"], 0)

        exported_recipient_ids = self.get_set(realm["zerver_recipient"], "id")
        self.assert_length(exported_recipient_ids, 6)
        exported_recipient_types = self.get_set(realm["zerver_recipient"],
                                                "type")
        self.assertEqual(exported_recipient_types, {1, 2})
        exported_recipient_type_ids = self.get_set(realm["zerver_recipient"],
                                                   "type_id")
        self.assert_length(exported_recipient_type_ids, 3)

        exported_subscription_userprofile = self.get_set(
            realm["zerver_subscription"], "user_profile")
        self.assert_length(exported_subscription_userprofile, 3)
        exported_subscription_recipients = self.get_set(
            realm["zerver_subscription"], "recipient")
        self.assert_length(exported_subscription_recipients, 6)

        messages = self.read_file(harry_team_output_dir,
                                  "messages-000001.json")

        exported_messages_id = self.get_set(messages["zerver_message"], "id")
        self.assertIn(messages["zerver_message"][0]["sender"],
                      exported_user_ids)
        self.assertIn(messages["zerver_message"][0]["recipient"],
                      exported_recipient_ids)
        self.assertIn(messages["zerver_message"][0]["content"],
                      "harry joined the channel.\n\n")

        exported_usermessage_userprofiles = self.get_set(
            messages["zerver_usermessage"], "user_profile")
        self.assert_length(exported_usermessage_userprofiles, 3)
        exported_usermessage_messages = self.get_set(
            messages["zerver_usermessage"], "message")
        self.assertEqual(exported_usermessage_messages, exported_messages_id)

        with self.assertLogs(level="INFO"):
            do_import_realm(
                import_dir=harry_team_output_dir,
                subdomain="gryffindor",
            )

        realm = get_realm("gryffindor")

        self.assertFalse(get_user("*****@*****.**", realm).is_mirror_dummy)
        self.assertFalse(get_user("*****@*****.**", realm).is_mirror_dummy)
        self.assertTrue(get_user("*****@*****.**", realm).is_mirror_dummy)

        messages = Message.objects.filter(sender__realm=realm)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)

        self.verify_emoji_code_foreign_keys()
    def test_do_convert_data(self) -> None:
        mattermost_data_dir = self.fixture_file_name("", "mattermost_fixtures")
        output_dir = self.make_import_output_dir("mattermost")

        do_convert_data(mattermost_data_dir=mattermost_data_dir,
                        output_dir=output_dir,
                        masking_content=False)

        harry_team_output_dir = self.team_output_dir(output_dir, "gryffindor")
        self.assertEqual(
            os.path.exists(os.path.join(harry_team_output_dir, 'avatars')),
            True)
        self.assertEqual(
            os.path.exists(os.path.join(harry_team_output_dir, 'emoji')), True)
        self.assertEqual(
            os.path.exists(
                os.path.join(harry_team_output_dir, 'attachment.json')), True)

        realm = self.read_file(harry_team_output_dir, 'realm.json')

        self.assertEqual('Organization imported from Mattermost!',
                         realm['zerver_realm'][0]['description'])

        exported_user_ids = self.get_set(realm['zerver_userprofile'], 'id')
        exported_user_full_names = self.get_set(realm['zerver_userprofile'],
                                                'full_name')
        self.assertEqual(set(['Harry Potter', 'Ron Weasley', 'Severus Snape']),
                         exported_user_full_names)

        exported_user_emails = self.get_set(realm['zerver_userprofile'],
                                            'email')
        self.assertEqual(
            set(['*****@*****.**', '*****@*****.**', '*****@*****.**']),
            exported_user_emails)

        self.assertEqual(len(realm['zerver_stream']), 3)
        exported_stream_names = self.get_set(realm['zerver_stream'], 'name')
        self.assertEqual(
            exported_stream_names,
            set([
                'Gryffindor common room', 'Gryffindor quidditch team',
                'Dumbledores army'
            ]))
        self.assertEqual(self.get_set(realm['zerver_stream'], 'realm'),
                         set([realm['zerver_realm'][0]['id']]))
        self.assertEqual(self.get_set(realm['zerver_stream'], 'deactivated'),
                         set([False]))

        self.assertEqual(len(realm['zerver_defaultstream']), 0)

        exported_recipient_ids = self.get_set(realm['zerver_recipient'], 'id')
        self.assertEqual(len(exported_recipient_ids), 6)
        exported_recipient_types = self.get_set(realm['zerver_recipient'],
                                                'type')
        self.assertEqual(exported_recipient_types, set([1, 2]))
        exported_recipient_type_ids = self.get_set(realm['zerver_recipient'],
                                                   'type_id')
        self.assertEqual(len(exported_recipient_type_ids), 3)

        exported_subscription_userprofile = self.get_set(
            realm['zerver_subscription'], 'user_profile')
        self.assertEqual(len(exported_subscription_userprofile), 3)
        exported_subscription_recipients = self.get_set(
            realm['zerver_subscription'], 'recipient')
        self.assertEqual(len(exported_subscription_recipients), 6)

        messages = self.read_file(harry_team_output_dir,
                                  'messages-000001.json')

        exported_messages_id = self.get_set(messages['zerver_message'], 'id')
        self.assertIn(messages['zerver_message'][0]['sender'],
                      exported_user_ids)
        self.assertIn(messages['zerver_message'][0]['recipient'],
                      exported_recipient_ids)
        self.assertIn(messages['zerver_message'][0]['content'],
                      'harry joined the channel.\n\n')

        exported_usermessage_userprofiles = self.get_set(
            messages['zerver_usermessage'], 'user_profile')
        self.assertEqual(len(exported_usermessage_userprofiles), 2)
        exported_usermessage_messages = self.get_set(
            messages['zerver_usermessage'], 'message')
        self.assertEqual(exported_usermessage_messages, exported_messages_id)

        do_import_realm(import_dir=harry_team_output_dir,
                        subdomain='gryffindor')
        realm = get_realm('gryffindor')

        realm_users = UserProfile.objects.filter(realm=realm)
        messages = Message.objects.filter(sender__in=realm_users)
        for message in messages:
            self.assertIsNotNone(message.rendered_content)