mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	This commit prepares us to introduce a StreamLite class. For these tests, we don't care about the actual contents of the Stream, just the right stream is there.
		
			
				
	
	
		
			148 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.conf import settings
 | 
						|
from django.core import mail
 | 
						|
from django.contrib.auth.signals import user_logged_in
 | 
						|
from zerver.lib.test_classes import ZulipTestCase
 | 
						|
from zerver.signals import get_device_browser, get_device_os
 | 
						|
from zerver.lib.actions import notify_new_user
 | 
						|
from zerver.models import Recipient, Stream
 | 
						|
from zerver.lib.initial_password import initial_password
 | 
						|
 | 
						|
class SendLoginEmailTest(ZulipTestCase):
 | 
						|
    """
 | 
						|
    Uses django's user_logged_in signal to send emails on new login.
 | 
						|
 | 
						|
    The receiver handler for this signal is always registered in production,
 | 
						|
    development and testing, but emails are only sent based on SEND_LOGIN_EMAILS setting.
 | 
						|
 | 
						|
    SEND_LOGIN_EMAILS is set to true in default settings.
 | 
						|
    It is turned off during testing.
 | 
						|
    """
 | 
						|
 | 
						|
    def test_send_login_emails_if_send_login_email_setting_is_true(self):
 | 
						|
        # type: () -> None
 | 
						|
        with self.settings(SEND_LOGIN_EMAILS=True):
 | 
						|
            self.assertTrue(settings.SEND_LOGIN_EMAILS)
 | 
						|
            # we don't use the self.login method since we spoof the user-agent
 | 
						|
            email = self.example_email('hamlet')
 | 
						|
            password = initial_password(email)
 | 
						|
            firefox_windows = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
 | 
						|
            self.client_post("/accounts/login/", info={"username": email, "password": password},
 | 
						|
                             HTTP_USER_AGENT=firefox_windows)
 | 
						|
 | 
						|
            # email is sent and correct subject
 | 
						|
            self.assertEqual(len(mail.outbox), 1)
 | 
						|
            subject = 'New login from Firefox on Windows'
 | 
						|
            self.assertEqual(mail.outbox[0].subject, subject)
 | 
						|
 | 
						|
    def test_dont_send_login_emails_if_send_login_emails_is_false(self):
 | 
						|
        # type: () -> None
 | 
						|
        self.assertFalse(settings.SEND_LOGIN_EMAILS)
 | 
						|
        email = self.example_email('hamlet')
 | 
						|
        self.login(email)
 | 
						|
 | 
						|
        self.assertEqual(len(mail.outbox), 0)
 | 
						|
 | 
						|
    def test_dont_send_login_emails_for_new_user_registration_logins(self):
 | 
						|
        # type: () -> None
 | 
						|
        with self.settings(SEND_LOGIN_EMAILS=True):
 | 
						|
            self.register("test@zulip.com", "test")
 | 
						|
 | 
						|
            # Verify that there's just 1 email for new user registration.
 | 
						|
            self.assertEqual(mail.outbox[0].subject, "Activate your Zulip account")
 | 
						|
            self.assertEqual(len(mail.outbox), 1)
 | 
						|
 | 
						|
    def test_without_path_info_dont_send_login_emails_for_new_user_registration_logins(self):
 | 
						|
        # type: () -> None
 | 
						|
        with self.settings(SEND_LOGIN_EMAILS=True):
 | 
						|
            self.client_post('/accounts/home/', {'email': "orange@zulip.com"})
 | 
						|
            self.submit_reg_form_for_user("orange@zulip.com", "orange", PATH_INFO='')
 | 
						|
 | 
						|
            for email in mail.outbox:
 | 
						|
                subject = 'New login from an unknown browser on an unknown operating system'
 | 
						|
                self.assertNotEqual(email.subject, subject)
 | 
						|
 | 
						|
class TestBrowserAndOsUserAgentStrings(ZulipTestCase):
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        # type: () -> None
 | 
						|
        self.user_agents = [
 | 
						|
            ('mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ' +
 | 
						|
                'Chrome/54.0.2840.59 Safari/537.36', 'Chrome', 'Linux',),
 | 
						|
            ('mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) ' +
 | 
						|
                'chrome/56.0.2924.87 safari/537.36', 'Chrome', 'Windows',),
 | 
						|
            ('mozilla/5.0 (windows nt 6.1; wow64; rv:51.0) ' +
 | 
						|
                'gecko/20100101 firefox/51.0', 'Firefox', 'Windows',),
 | 
						|
            ('mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0) ' +
 | 
						|
                'like gecko', 'Internet Explorer', 'Windows'),
 | 
						|
            ('Mozilla/5.0 (Android; Mobile; rv:27.0) ' +
 | 
						|
                'Gecko/27.0 Firefox/27.0', 'Firefox', 'Android'),
 | 
						|
            ('Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) ' +
 | 
						|
                'AppleWebKit/536.26 (KHTML, like Gecko) ' +
 | 
						|
                'Version/6.0 Mobile/10B329 Safari/8536.25', 'Safari', 'iOS'),
 | 
						|
            ('Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) ' +
 | 
						|
                'AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B350', None, 'iOS'),
 | 
						|
            ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) ' +
 | 
						|
                'AppleWebKit/537.36 (KHTML, like Gecko) ' +
 | 
						|
                'Chrome/56.0.2924.87 Safari/537.36', 'Chrome', 'macOS'),
 | 
						|
            ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) ' +
 | 
						|
                'AppleWebKit/602.3.12 (KHTML, like Gecko) ' +
 | 
						|
                'Version/10.0.2 Safari/602.3.12', 'Safari', 'macOS'),
 | 
						|
            ('ZulipAndroid/1.0', 'Zulip', 'Android'),
 | 
						|
            ('ZulipMobile/1.0.12 (Android 7.1.1)', 'Zulip', 'Android'),
 | 
						|
            ('ZulipMobile/0.7.1.1 (iOS 10.3.1)', 'Zulip', 'iOS'),
 | 
						|
            ('ZulipElectron/1.1.0-beta Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' +
 | 
						|
             'AppleWebKit/537.36 (KHTML, like Gecko) Zulip/1.1.0-beta ' +
 | 
						|
             'Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36', 'Zulip', 'Windows'),
 | 
						|
            ('Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, '
 | 
						|
             'like Gecko) Ubuntu/11.10 Chromium/16.0.912.77 '
 | 
						|
             'Chrome/16.0.912.77 Safari/535.7', 'Chromium', 'Linux'),
 | 
						|
            ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
 | 
						|
             '(KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 '
 | 
						|
             'OPR/15.0.1147.100', 'Opera', 'Windows'),
 | 
						|
            ('Mozilla/5.0 (Windows NT 10.0; <64-bit tags>) AppleWebKit/'
 | 
						|
             '<WebKit Rev> (KHTML, like Gecko) Chrome/<Chrome Rev> Safari'
 | 
						|
             '/<WebKit Rev> Edge/<EdgeHTML Rev>.'
 | 
						|
             '<Windows Build>', 'Edge', 'Windows'),
 | 
						|
            ('', None, None),
 | 
						|
        ]
 | 
						|
 | 
						|
    def test_get_browser_on_new_login(self):
 | 
						|
        # type: () -> None
 | 
						|
        for user_agent in self.user_agents:
 | 
						|
            device_browser = get_device_browser(user_agent[0])
 | 
						|
            self.assertEqual(device_browser, user_agent[1])
 | 
						|
 | 
						|
    def test_get_os_on_new_login(self):
 | 
						|
        # type: () -> None
 | 
						|
        for user_agent in self.user_agents:
 | 
						|
            device_os = get_device_os(user_agent[0])
 | 
						|
            self.assertEqual(device_os, user_agent[2])
 | 
						|
 | 
						|
 | 
						|
class TestNotifyNewUser(ZulipTestCase):
 | 
						|
    def test_notify_of_new_user_internally(self):
 | 
						|
        # type: () -> None
 | 
						|
        new_user = self.example_user('cordelia')
 | 
						|
        self.make_stream('signups')
 | 
						|
        notify_new_user(new_user, internal=True)
 | 
						|
 | 
						|
        message = self.get_last_message()
 | 
						|
        actual_stream = Stream.objects.get(id=message.recipient.type_id)
 | 
						|
        self.assertEqual(actual_stream.name, 'signups')
 | 
						|
        self.assertEqual(message.recipient.type, Recipient.STREAM)
 | 
						|
        self.assertIn("**INTERNAL SIGNUP**", message.content)
 | 
						|
 | 
						|
    def test_notify_realm_of_new_user(self):
 | 
						|
        # type: () -> None
 | 
						|
        new_user = self.example_user('cordelia')
 | 
						|
        stream = self.make_stream('announce')
 | 
						|
        new_user.realm.notifications_stream_id = stream.id
 | 
						|
        new_user.realm.save()
 | 
						|
        new_user = self.example_user('cordelia')
 | 
						|
        notify_new_user(new_user)
 | 
						|
 | 
						|
        message = self.get_last_message()
 | 
						|
        self.assertEqual(message.recipient.type, Recipient.STREAM)
 | 
						|
        actual_stream = Stream.objects.get(id=message.recipient.type_id)
 | 
						|
        self.assertEqual(actual_stream.name, 'announce')
 |