mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 13:33:24 +00:00
Fixes #2665. Regenerated by tabbott with `lint --fix` after a rebase and change in parameters. Note from tabbott: In a few cases, this converts technical debt in the form of unsorted imports into different technical debt in the form of our largest files having very long, ugly import sequences at the start. I expect this change will increase pressure for us to split those files, which isn't a bad thing. Signed-off-by: Anders Kaseorg <anders@zulip.com>
86 lines
4.2 KiB
Python
86 lines
4.2 KiB
Python
# These are tests for Zulip's database migrations. System documented at:
|
|
# https://zulip.readthedocs.io/en/latest/subsystems/schema-migrations.html
|
|
#
|
|
# You can also read
|
|
# https://www.caktusgroup.com/blog/2016/02/02/writing-unit-tests-django-migrations/
|
|
# to get a tutorial on the framework that inspired this feature.
|
|
from django.db.migrations.state import StateApps
|
|
|
|
from zerver.lib.test_classes import MigrationsTestCase
|
|
from zerver.lib.test_helpers import use_db_models
|
|
from zerver.models import get_stream
|
|
|
|
# Important note: These tests are very expensive, and details of
|
|
# Django's database transaction model mean it does not super work to
|
|
# have a lot of migrations tested in this file at once; so we usually
|
|
# delete the old migration tests when adding a new one, so this file
|
|
# always has a single migration test in it as an example.
|
|
#
|
|
# The error you get with multiple similar tests doing migrations on
|
|
# the same table is this (table name may vary):
|
|
#
|
|
# django.db.utils.OperationalError: cannot ALTER TABLE
|
|
# "zerver_subscription" because it has pending trigger events
|
|
#
|
|
# As a result, we generally mark these tests as skipped once they have
|
|
# been tested for a migration being merged.
|
|
|
|
class SubsNotificationSettingsTestCase(MigrationsTestCase): # nocoverage
|
|
__unittest_skip__ = True
|
|
|
|
migrate_from = '0220_subscription_notification_settings'
|
|
migrate_to = '0221_subscription_notifications_data_migration'
|
|
RECIPIENT_PERSONAL = 1
|
|
RECIPIENT_STREAM = 2
|
|
|
|
@use_db_models
|
|
def setUpBeforeMigration(self, apps: StateApps) -> None:
|
|
Recipient = apps.get_model('zerver', 'Recipient')
|
|
Subscription = apps.get_model('zerver', 'Subscription')
|
|
|
|
iago = self.example_user('iago')
|
|
iago.enable_stream_desktop_notifications = True
|
|
iago.enable_stream_audible_notifications = False
|
|
iago.enable_desktop_notifications = True
|
|
iago.enable_online_push_notifications = True
|
|
iago.enable_sounds = False
|
|
iago.save()
|
|
|
|
stream_name = 'Denmark'
|
|
denmark = get_stream(stream_name, iago.realm)
|
|
denmark_recipient = Recipient.objects.get(type=self.RECIPIENT_STREAM, type_id=denmark.id)
|
|
denmark_sub = Subscription.objects.get(user_profile=iago, recipient=denmark_recipient)
|
|
denmark_sub.desktop_notifications = False
|
|
denmark_sub.audible_notifications = False
|
|
denmark_sub.save(update_fields=['desktop_notifications', 'audible_notifications'])
|
|
|
|
iago_recipient = Recipient.objects.get(type=self.RECIPIENT_PERSONAL, type_id=iago.id)
|
|
iago_sub = Subscription.objects.get(user_profile=iago, recipient=iago_recipient)
|
|
iago_sub.desktop_notifications = False
|
|
iago_sub.audible_notifications = False
|
|
iago_sub.push_notifications = True
|
|
iago_sub.save(update_fields=['desktop_notifications', 'audible_notifications', 'push_notifications'])
|
|
|
|
def test_subs_migrated(self) -> None:
|
|
UserProfile = self.apps.get_model('zerver', 'UserProfile')
|
|
Recipient = self.apps.get_model('zerver', 'Recipient')
|
|
Realm = self.apps.get_model('zerver', 'Realm')
|
|
Subscription = self.apps.get_model('zerver', 'Subscription')
|
|
Stream = self.apps.get_model('zerver', 'Stream')
|
|
|
|
realm = Realm.objects.get(string_id='zulip')
|
|
iago = UserProfile.objects.get(email='iago@zulip.com', realm=realm)
|
|
stream_name = 'Denmark'
|
|
denmark = Stream.objects.get(realm=iago.realm, name=stream_name)
|
|
denmark_recipient = Recipient.objects.get(type=self.RECIPIENT_STREAM, type_id=denmark.id)
|
|
denmark_sub = Subscription.objects.get(user_profile=iago, recipient=denmark_recipient)
|
|
self.assertEqual(denmark_sub.desktop_notifications, False)
|
|
self.assertIsNone(denmark_sub.audible_notifications)
|
|
|
|
# Zulip ignores subscription's notification related settings for PMs so don't migrate them.
|
|
iago_recipient = Recipient.objects.get(type=self.RECIPIENT_PERSONAL, type_id=iago.id)
|
|
iago_sub = Subscription.objects.get(user_profile=iago, recipient=iago_recipient)
|
|
self.assertEqual(iago_sub.desktop_notifications, False)
|
|
self.assertEqual(iago_sub.audible_notifications, False)
|
|
self.assertEqual(iago_sub.push_notifications, True)
|