Beispiel #1
0
    def test_migrate_disabled(self):
        """Testing AvatarServiceRegistry migrates avatar settings for disabled
        gravatars
        """
        # Verify the pre-conditions.
        siteconfig = SiteConfiguration.objects.get_current()
        self.assertFalse(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))

        siteconfig.set('integration_gravatars', False)
        siteconfig.save()

        registry = AvatarServiceRegistry()

        # Verify all services are disabled.
        self.assertSetEqual(set(registry), {
            FileUploadService,
            GravatarService,
            URLAvatarService,
        })
        self.assertIsNone(registry.default_service)
        self.assertSetEqual(set(registry.enabled_services), set())

        # Verify the settings were correctly saved to the database.
        siteconfig = SiteConfiguration.objects.get_current()
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertFalse(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))
        self.assertListEqual(
            siteconfig.get(AvatarServiceRegistry.ENABLED_SERVICES_KEY), [])
        self.assertIsNone(
            siteconfig.get(AvatarServiceRegistry.DEFAULT_SERVICE_KEY))
Beispiel #2
0
    def test_migrate_enabled(self):
        """Testing AvatarServiceRegistry migrates avatar settings for enabled
        gravatars
        """
        # Verify the pre-conditions.
        siteconfig = SiteConfiguration.objects.get_current()
        self.assertFalse(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))
        self.assertListEqual(
            siteconfig.get(AvatarServiceRegistry.ENABLED_SERVICES_KEY),
            [])

        registry = AvatarServiceRegistry()

        # Verify that the Gravatar service is enabled.
        gravatar_service = registry.get_avatar_service(
            GravatarService.avatar_service_id)

        upload_service = registry.get_avatar_service(
            FileUploadService.avatar_service_id)
        self.assertIsNotNone(gravatar_service)
        self.assertIs(type(gravatar_service), GravatarService)
        self.assertSetEqual(set(registry), {upload_service, gravatar_service})

        self.assertIs(registry.default_service, gravatar_service)
        self.assertSetEqual(set(registry.enabled_services),
                            {gravatar_service, upload_service})

        # Verify that the settings were saved correctly to the database.
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))
        self.assertListEqual(
            siteconfig.get(AvatarServiceRegistry.ENABLED_SERVICES_KEY),
            [GravatarService.avatar_service_id,
             FileUploadService.avatar_service_id])
        self.assertEqual(
            siteconfig.get(AvatarServiceRegistry.DEFAULT_SERVICE_KEY),
            GravatarService.avatar_service_id)
Beispiel #3
0
    def test_migrate_enabled(self):
        """Testing AvatarServiceRegistry migrates avatar settings for enabled
        gravatars
        """
        # Verify the pre-conditions.
        siteconfig = SiteConfiguration.objects.get_current()
        self.assertFalse(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))
        self.assertListEqual(
            siteconfig.get(AvatarServiceRegistry.ENABLED_SERVICES_KEY), [])

        registry = AvatarServiceRegistry()

        # Verify that the Gravatar service is enabled.
        gravatar_service = registry.get_avatar_service(
            GravatarService.avatar_service_id)

        upload_service = registry.get_avatar_service(
            FileUploadService.avatar_service_id)
        self.assertIsNotNone(gravatar_service)
        self.assertIs(type(gravatar_service), GravatarService)
        self.assertSetEqual(set(registry), {upload_service, gravatar_service})

        self.assertIs(registry.default_service, gravatar_service)
        self.assertSetEqual(set(registry.enabled_services),
                            {gravatar_service, upload_service})

        # Verify that the settings were saved correctly to the database.
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))
        self.assertListEqual(
            siteconfig.get(AvatarServiceRegistry.ENABLED_SERVICES_KEY), [
                GravatarService.avatar_service_id,
                FileUploadService.avatar_service_id
            ])
        self.assertEqual(
            siteconfig.get(AvatarServiceRegistry.DEFAULT_SERVICE_KEY),
            GravatarService.avatar_service_id)
Beispiel #4
0
    def test_migrate_disabled(self):
        """Testing AvatarServiceRegistry migrates avatar settings for disabled
        gravatars
        """
        # Verify the pre-conditions.
        siteconfig = SiteConfiguration.objects.get_current()
        self.assertFalse(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))

        siteconfig.set('integration_gravatars', False)
        siteconfig.save()

        registry = AvatarServiceRegistry()

        # Verify the GravatarService is the only service and that is disabled.
        gravatar_service = registry.get('avatar_service_id',
                                        GravatarService.avatar_service_id)
        self.assertIsNotNone(gravatar_service)
        self.assertIs(type(gravatar_service), GravatarService)
        self.assertSetEqual(set(registry), set([gravatar_service]))

        self.assertIsNone(registry.default_service)
        self.assertSetEqual(set(registry.enabled_services), set())

        # Verify the settings were correctly saved to the database.
        siteconfig = SiteConfiguration.objects.get_current()
        self.assertTrue(
            siteconfig.get(AvatarServiceRegistry.AVATARS_MIGRATED_KEY))
        self.assertFalse(
            siteconfig.get(AvatarServiceRegistry.AVATARS_ENABLED_KEY))
        self.assertListEqual(
            siteconfig.get(AvatarServiceRegistry.ENABLED_SERVICES_KEY),
            [])
        self.assertIsNone(
            siteconfig.get(AvatarServiceRegistry.DEFAULT_SERVICE_KEY))
Beispiel #5
0
from __future__ import unicode_literals

from reviewboard.avatars.registry import AvatarServiceRegistry

#: The avatar services registry.
avatar_services = AvatarServiceRegistry()
Beispiel #6
0
    def setUp(self):
        super(AvatarServiceRegistryTests, self).setUp()

        self.registry = AvatarServiceRegistry()
        self.siteconfig = SiteConfiguration.objects.get_current()
Beispiel #7
0
class AvatarServiceRegistryTests(AvatarServicesTestMixin, TestCase):
    """Tests for reviewboard.avatars."""

    _enabled_service_ids = [
        GravatarService.avatar_service_id,
        FileUploadService.avatar_service_id,
        URLAvatarService.avatar_service_id,
    ]

    _default_service_id = GravatarService.avatar_service_id

    def setUp(self):
        super(AvatarServiceRegistryTests, self).setUp()

        self.registry = AvatarServiceRegistry()
        self.siteconfig = SiteConfiguration.objects.get_current()

    def test_defaults(self):
        """Testing AvatarServiceRegistry default services state"""
        self.assertEqual(set(self.registry), {
            FileUploadService,
            GravatarService,
            URLAvatarService,
        })

        self.assertIsInstance(self.registry.default_service, GravatarService)
        self.assertEqual(set(self.registry.enabled_services), {
            FileUploadService,
            GravatarService,
            URLAvatarService,
        })

    def test_get_siteconfig_defaults(self):
        """Testing AvatarServiceRegistry.get_siteconfig_defaults"""
        self.assertEqual(
            self.registry.get_siteconfig_defaults(), {
                AVATARS_ENABLED_KEY: True,
                ENABLED_SERVICES_KEY: self._enabled_service_ids,
                DEFAULT_SERVICE_KEY: self._default_service_id,
            })

    def test_migrate_settings_pre_2_0_with_enabled(self):
        """Testing AvatarServiceRegistry.migrate_settings migrates pre-2.0
        settings
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_INTEGRATION_GRAVATARS_KEY, siteconfig_settings)

        # Perform the migration.
        self._perform_migration(expect_has_enabled_saved=False,
                                expect_migrated=False)

    def test_migrate_settings_pre_3_0_with_enabled(self):
        """Testing AvatarServiceRegistry.migrate_settings migrates pre-3.0
        avatar settings for enabled Gravatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)

        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration(expect_has_enabled_saved=False)

    def test_migrate_pre_3_0_disabled(self):
        """Testing AvatarServiceRegistry migrates pre-3.0 avatar settings for
        disabled Gravatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)

        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, False)

        # Perform the migration.
        self._perform_migration(expect_enabled=False)

    def test_migrate_3_0_pre_4_disabled(self):
        """Testing AvatarServiceRegistry migrates 3.0.[0-3] avatar settings for
        migrated disabled avatars
        """
        enabled_service_ids = [
            GravatarService.avatar_service_id,
            URLAvatarService.avatar_service_id,
        ]
        default_service_id = URLAvatarService.avatar_service_id

        self.siteconfig.set(AVATARS_ENABLED_KEY, False)
        self.siteconfig.set(DEFAULT_SERVICE_KEY, default_service_id)
        self.siteconfig.set(ENABLED_SERVICES_KEY, enabled_service_ids)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration(expect_enabled=False,
                                expected_enabled_services=enabled_service_ids,
                                expected_default_service=default_service_id,
                                expect_has_services_saved=True)

    def test_migrate_3_0_pre_4_enabled(self):
        """Testing AvatarServiceRegistry migrates 3.0.[0-3] avatar settings for
        migrated enabled avatars
        """
        enabled_service_ids = [
            GravatarService.avatar_service_id,
            URLAvatarService.avatar_service_id,
        ]
        default_service_id = URLAvatarService.avatar_service_id

        self.siteconfig.set(AVATARS_ENABLED_KEY, True)
        self.siteconfig.set(DEFAULT_SERVICE_KEY, default_service_id)
        self.siteconfig.set(ENABLED_SERVICES_KEY, enabled_service_ids)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration(expected_enabled_services=enabled_service_ids,
                                expected_default_service=default_service_id,
                                expect_has_services_saved=True)

    def test_migrate_already_migrated_enabled(self):
        """Testing AvatarServiceRegistry does not migrate already-migrated
        settings with enabled avatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)

        self.siteconfig.set(AVATARS_ENABLED_KEY, True)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration()

    def test_migrate_already_migrated_disabled(self):
        """Testing AvatarServiceRegistry does not migrate already-migrated
        settings with disabled avatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)

        self.siteconfig.set(AVATARS_ENABLED_KEY, True)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration()

    def test_migrate_with_fresh_install(self):
        """Testing AvatarServiceRegistry does not migrate fresh settings
        settings with disabled avatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_INTEGRATION_GRAVATARS_KEY, siteconfig_settings)

        # Perform the migration.
        self._perform_migration(expect_migrated=False,
                                expect_has_enabled_saved=False)

    def _perform_migration(self,
                           expect_migrated=True,
                           expect_enabled=True,
                           expected_enabled_services=_enabled_service_ids,
                           expected_default_service=_default_service_id,
                           expect_has_services_saved=False,
                           expect_has_enabled_saved=True):
        """Perform an avatar settings migration test.

        This will trigger a migration of the existing settings, checking the
        final results in the database based on the expectations of the caller.
        This helps to unify all of our various migration tests.

        Args:
            expect_migrated (bool, optional):
                Whether the migration attempt is expected to have made changes
                to the stored site configuration.

            expect_enabled (bool, optional):
                Whether avatars are expected to be enabled after the migration.

            expected_enabled_services (list, optional):
                The list of avatar service IDs that are expected to be enabled
                after the migration.

            expected_default_service (unicode, optional):
                The avatar service ID that is expected to be set as the
                default.

            expect_has_services_saved (bool, optional):
                Whether the site configuration is expected to have a list of
                service IDs explicitly saved.

            expect_has_enabled_saved (bool, optional):
                Whether the site configuration is expected to have the enabled
                state explicitly saved.
        """
        migrated = self.registry.migrate_settings(self.siteconfig)
        self.assertEqual(migrated, expect_migrated)

        if migrated:
            self.siteconfig.save()

        # Make sure the default avatar and available/enabled avatars are
        # still there.
        self.assertEqual(self.registry.default_service.avatar_service_id,
                         expected_default_service)
        self.assertEqual(set(self.registry), {
            FileUploadService,
            GravatarService,
            URLAvatarService,
        })
        self.assertEqual(
            {
                avatar_service.avatar_service_id
                for avatar_service in self.registry.enabled_services
            }, set(expected_enabled_services))

        # Verify that the saved settings reflect the correct state. These
        # checks include the defaults:
        siteconfig = SiteConfiguration.objects.get(pk=self.siteconfig.pk)
        self.assertIs(siteconfig.get(AVATARS_ENABLED_KEY), expect_enabled)
        self.assertEqual(siteconfig.get(ENABLED_SERVICES_KEY),
                         expected_enabled_services)
        self.assertEqual(siteconfig.get(DEFAULT_SERVICE_KEY),
                         expected_default_service)
        self.assertIsNone(siteconfig.get(LEGACY_AVATARS_MIGRATED_KEY))
        self.assertIsNone(siteconfig.get(LEGACY_INTEGRATION_GRAVATARS_KEY))

        # These checks are for what's actually written to siteconfig.
        siteconfig_settings = siteconfig.settings
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_INTEGRATION_GRAVATARS_KEY, siteconfig_settings)

        if expect_has_enabled_saved:
            self.assertIs(siteconfig_settings.get(AVATARS_ENABLED_KEY),
                          expect_enabled)
        else:
            self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)

        if expect_has_services_saved:
            self.assertIn(ENABLED_SERVICES_KEY, siteconfig_settings)
            self.assertIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
            self.assertEqual(siteconfig_settings[ENABLED_SERVICES_KEY],
                             expected_enabled_services)
            self.assertEqual(siteconfig_settings[DEFAULT_SERVICE_KEY],
                             expected_default_service)
        else:
            self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
            self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
Beispiel #8
0
    def setUp(self):
        super(AvatarServiceRegistryTests, self).setUp()

        self.registry = AvatarServiceRegistry()
        self.siteconfig = SiteConfiguration.objects.get_current()
Beispiel #9
0
class AvatarServiceRegistryTests(AvatarServicesTestMixin, TestCase):
    """Tests for reviewboard.avatars."""

    _enabled_service_ids = [
        GravatarService.avatar_service_id,
        FileUploadService.avatar_service_id,
        URLAvatarService.avatar_service_id,
    ]

    _default_service_id = GravatarService.avatar_service_id

    def setUp(self):
        super(AvatarServiceRegistryTests, self).setUp()

        self.registry = AvatarServiceRegistry()
        self.siteconfig = SiteConfiguration.objects.get_current()

    def test_defaults(self):
        """Testing AvatarServiceRegistry default services state"""
        self.assertEqual(
            set(self.registry),
            {
                FileUploadService,
                GravatarService,
                URLAvatarService,
            })

        self.assertIsInstance(self.registry.default_service, GravatarService)
        self.assertEqual(
            set(self.registry.enabled_services),
            {
                FileUploadService,
                GravatarService,
                URLAvatarService,
            })

    def test_get_siteconfig_defaults(self):
        """Testing AvatarServiceRegistry.get_siteconfig_defaults"""
        self.assertEqual(
            self.registry.get_siteconfig_defaults(),
            {
                AVATARS_ENABLED_KEY: True,
                ENABLED_SERVICES_KEY: self._enabled_service_ids,
                DEFAULT_SERVICE_KEY: self._default_service_id,
            })

    def test_migrate_settings_pre_2_0_with_enabled(self):
        """Testing AvatarServiceRegistry.migrate_settings migrates pre-2.0
        settings
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_INTEGRATION_GRAVATARS_KEY, siteconfig_settings)

        # Perform the migration.
        self._perform_migration(expect_has_enabled_saved=False,
                                expect_migrated=False)

    def test_migrate_settings_pre_3_0_with_enabled(self):
        """Testing AvatarServiceRegistry.migrate_settings migrates pre-3.0
        avatar settings for enabled Gravatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)

        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration(expect_has_enabled_saved=False)

    def test_migrate_pre_3_0_disabled(self):
        """Testing AvatarServiceRegistry migrates pre-3.0 avatar settings for
        disabled Gravatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)

        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, False)

        # Perform the migration.
        self._perform_migration(expect_enabled=False)

    def test_migrate_3_0_pre_4_disabled(self):
        """Testing AvatarServiceRegistry migrates 3.0.[0-3] avatar settings for
        migrated disabled avatars
        """
        enabled_service_ids = [
            GravatarService.avatar_service_id,
            URLAvatarService.avatar_service_id,
        ]
        default_service_id = URLAvatarService.avatar_service_id

        self.siteconfig.set(AVATARS_ENABLED_KEY, False)
        self.siteconfig.set(DEFAULT_SERVICE_KEY, default_service_id)
        self.siteconfig.set(ENABLED_SERVICES_KEY, enabled_service_ids)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration(expect_enabled=False,
                                expected_enabled_services=enabled_service_ids,
                                expected_default_service=default_service_id,
                                expect_has_services_saved=True)

    def test_migrate_3_0_pre_4_enabled(self):
        """Testing AvatarServiceRegistry migrates 3.0.[0-3] avatar settings for
        migrated enabled avatars
        """
        enabled_service_ids = [
            GravatarService.avatar_service_id,
            URLAvatarService.avatar_service_id,
        ]
        default_service_id = URLAvatarService.avatar_service_id

        self.siteconfig.set(AVATARS_ENABLED_KEY, True)
        self.siteconfig.set(DEFAULT_SERVICE_KEY, default_service_id)
        self.siteconfig.set(ENABLED_SERVICES_KEY, enabled_service_ids)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration(expected_enabled_services=enabled_service_ids,
                                expected_default_service=default_service_id,
                                expect_has_services_saved=True)

    def test_migrate_already_migrated_enabled(self):
        """Testing AvatarServiceRegistry does not migrate already-migrated
        settings with enabled avatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)

        self.siteconfig.set(AVATARS_ENABLED_KEY, True)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration()

    def test_migrate_already_migrated_disabled(self):
        """Testing AvatarServiceRegistry does not migrate already-migrated
        settings with disabled avatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)

        self.siteconfig.set(AVATARS_ENABLED_KEY, True)
        self.siteconfig.set(LEGACY_AVATARS_MIGRATED_KEY, True)
        self.siteconfig.set(LEGACY_INTEGRATION_GRAVATARS_KEY, True)

        # Perform the migration.
        self._perform_migration()

    def test_migrate_with_fresh_install(self):
        """Testing AvatarServiceRegistry does not migrate fresh settings
        settings with disabled avatars
        """
        siteconfig_settings = self.siteconfig.settings

        self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)
        self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
        self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_INTEGRATION_GRAVATARS_KEY, siteconfig_settings)

        # Perform the migration.
        self._perform_migration(expect_migrated=False,
                                expect_has_enabled_saved=False)

    def _perform_migration(self,
                           expect_migrated=True,
                           expect_enabled=True,
                           expected_enabled_services=_enabled_service_ids,
                           expected_default_service=_default_service_id,
                           expect_has_services_saved=False,
                           expect_has_enabled_saved=True):
        """Perform an avatar settings migration test.

        This will trigger a migration of the existing settings, checking the
        final results in the database based on the expectations of the caller.
        This helps to unify all of our various migration tests.

        Args:
            expect_migrated (bool, optional):
                Whether the migration attempt is expected to have made changes
                to the stored site configuration.

            expect_enabled (bool, optional):
                Whether avatars are expected to be enabled after the migration.

            expected_enabled_services (list, optional):
                The list of avatar service IDs that are expected to be enabled
                after the migration.

            expected_default_service (unicode, optional):
                The avatar service ID that is expected to be set as the
                default.

            expect_has_services_saved (bool, optional):
                Whether the site configuration is expected to have a list of
                service IDs explicitly saved.

            expect_has_enabled_saved (bool, optional):
                Whether the site configuration is expected to have the enabled
                state explicitly saved.
        """
        migrated = self.registry.migrate_settings(self.siteconfig)
        self.assertEqual(migrated, expect_migrated)

        if migrated:
            self.siteconfig.save()

        # Make sure the default avatar and available/enabled avatars are
        # still there.
        self.assertEqual(self.registry.default_service.avatar_service_id,
                         expected_default_service)
        self.assertEqual(
            set(self.registry),
            {
                FileUploadService,
                GravatarService,
                URLAvatarService,
            })
        self.assertEqual(
            {
                avatar_service.avatar_service_id
                for avatar_service in self.registry.enabled_services
            },
            set(expected_enabled_services))

        # Verify that the saved settings reflect the correct state. These
        # checks include the defaults:
        siteconfig = SiteConfiguration.objects.get(pk=self.siteconfig.pk)
        self.assertIs(siteconfig.get(AVATARS_ENABLED_KEY), expect_enabled)
        self.assertEqual(siteconfig.get(ENABLED_SERVICES_KEY),
                         expected_enabled_services)
        self.assertEqual(siteconfig.get(DEFAULT_SERVICE_KEY),
                         expected_default_service)
        self.assertIsNone(siteconfig.get(LEGACY_AVATARS_MIGRATED_KEY))
        self.assertIsNone(siteconfig.get(LEGACY_INTEGRATION_GRAVATARS_KEY))

        # These checks are for what's actually written to siteconfig.
        siteconfig_settings = siteconfig.settings
        self.assertNotIn(LEGACY_AVATARS_MIGRATED_KEY, siteconfig_settings)
        self.assertNotIn(LEGACY_INTEGRATION_GRAVATARS_KEY, siteconfig_settings)

        if expect_has_enabled_saved:
            self.assertIs(siteconfig_settings.get(AVATARS_ENABLED_KEY),
                          expect_enabled)
        else:
            self.assertNotIn(AVATARS_ENABLED_KEY, siteconfig_settings)

        if expect_has_services_saved:
            self.assertIn(ENABLED_SERVICES_KEY, siteconfig_settings)
            self.assertIn(DEFAULT_SERVICE_KEY, siteconfig_settings)
            self.assertEqual(siteconfig_settings[ENABLED_SERVICES_KEY],
                             expected_enabled_services)
            self.assertEqual(siteconfig_settings[DEFAULT_SERVICE_KEY],
                             expected_default_service)
        else:
            self.assertNotIn(ENABLED_SERVICES_KEY, siteconfig_settings)
            self.assertNotIn(DEFAULT_SERVICE_KEY, siteconfig_settings)