|
31 | 31 | from contentcuration.models import FlagFeedbackEvent |
32 | 32 | from contentcuration.models import generate_object_storage_name |
33 | 33 | from contentcuration.models import Invitation |
| 34 | +from contentcuration.models import Language |
34 | 35 | from contentcuration.models import License |
35 | 36 | from contentcuration.models import object_storage_name |
36 | 37 | from contentcuration.models import RecommendationsEvent |
@@ -1814,3 +1815,105 @@ def test_version_cannot_exceed_channel_version(self): |
1814 | 1815 | self.assertIn( |
1815 | 1816 | "Version cannot be greater than channel version", str(context.exception) |
1816 | 1817 | ) |
| 1818 | + |
| 1819 | + def test_save_snapshots_channel_info_when_version_matches_channel_version(self): |
| 1820 | + """Creating a ChannelVersion whose version equals channel.version should |
| 1821 | + automatically snapshot the channel's current name, description, tagline, |
| 1822 | + thumbnail_encoding, and language.""" |
| 1823 | + lang = Language.objects.first() |
| 1824 | + # Use a queryset update to set channel fields without triggering on_update |
| 1825 | + # (which would call get_or_create and collide with the ChannelVersion we're |
| 1826 | + # about to create ourselves). |
| 1827 | + Channel.objects.filter(id=self.channel.id).update( |
| 1828 | + name="Snapshot Channel", |
| 1829 | + description="A channel to snapshot", |
| 1830 | + tagline="Learn something new", |
| 1831 | + thumbnail_encoding={"base64": "abc123"}, |
| 1832 | + language=lang, |
| 1833 | + ) |
| 1834 | + self.channel.refresh_from_db() |
| 1835 | + |
| 1836 | + # setUp's self.channel.save() already auto-created a ChannelVersion for |
| 1837 | + # version 10 via on_update. Delete it so we can create a fresh one and |
| 1838 | + # observe the snapshot logic. |
| 1839 | + ChannelVersion.objects.filter( |
| 1840 | + channel=self.channel, version=self.channel.version |
| 1841 | + ).delete() |
| 1842 | + |
| 1843 | + cv = ChannelVersion( |
| 1844 | + channel=self.channel, |
| 1845 | + version=self.channel.version, |
| 1846 | + ) |
| 1847 | + cv.save() |
| 1848 | + |
| 1849 | + cv.refresh_from_db() |
| 1850 | + self.assertEqual(cv.channel_name, self.channel.name) |
| 1851 | + self.assertEqual(cv.channel_description, self.channel.description) |
| 1852 | + self.assertEqual(cv.channel_tagline, self.channel.tagline) |
| 1853 | + self.assertEqual(cv.channel_thumbnail_encoding, self.channel.thumbnail_encoding) |
| 1854 | + self.assertEqual(cv.channel_language, self.channel.language) |
| 1855 | + |
| 1856 | + def test_save_does_not_snapshot_when_version_differs_from_channel_version(self): |
| 1857 | + """Creating a ChannelVersion for an older version should NOT populate |
| 1858 | + the snapshot fields automatically.""" |
| 1859 | + self.channel.name = "Current Name" |
| 1860 | + self.channel.save() |
| 1861 | + |
| 1862 | + # version 5 is less than channel.version (10) |
| 1863 | + cv = ChannelVersion( |
| 1864 | + channel=self.channel, |
| 1865 | + version=5, |
| 1866 | + ) |
| 1867 | + cv.save() |
| 1868 | + |
| 1869 | + cv.refresh_from_db() |
| 1870 | + self.assertIsNone(cv.channel_name) |
| 1871 | + self.assertIsNone(cv.channel_description) |
| 1872 | + self.assertIsNone(cv.channel_tagline) |
| 1873 | + self.assertIsNone(cv.channel_language) |
| 1874 | + |
| 1875 | + def test_save_does_not_re_snapshot_on_update(self): |
| 1876 | + """Updating an existing ChannelVersion (not adding) should NOT overwrite |
| 1877 | + the snapshot fields even if the channel info has changed.""" |
| 1878 | + # setUp's self.channel.save() already created a ChannelVersion for version 10 |
| 1879 | + # via on_update -> get_or_create. Reuse that existing object so we're |
| 1880 | + # testing a genuine update (not insert) path. |
| 1881 | + cv = ChannelVersion.objects.get( |
| 1882 | + channel=self.channel, version=self.channel.version |
| 1883 | + ) |
| 1884 | + original_name = cv.channel_name |
| 1885 | + |
| 1886 | + # Change the channel name via a queryset update so on_update is not called |
| 1887 | + # (avoiding a second get_or_create for the same version). |
| 1888 | + Channel.objects.filter(id=self.channel.id).update(name="Updated Channel Name") |
| 1889 | + self.channel.refresh_from_db() |
| 1890 | + |
| 1891 | + cv.version_notes = "some notes" |
| 1892 | + cv.save() |
| 1893 | + |
| 1894 | + cv.refresh_from_db() |
| 1895 | + # The snapshot should still reflect the name captured when cv was first created. |
| 1896 | + self.assertEqual(cv.channel_name, original_name) |
| 1897 | + self.assertNotEqual(cv.channel_name, "Updated Channel Name") |
| 1898 | + |
| 1899 | + def test_save_snapshots_null_language_when_channel_has_no_language(self): |
| 1900 | + """When the channel has no language set, channel_language on the snapshot |
| 1901 | + should remain None.""" |
| 1902 | + # Ensure no language on the channel via queryset update (bypasses on_update). |
| 1903 | + Channel.objects.filter(id=self.channel.id).update(language=None) |
| 1904 | + self.channel.refresh_from_db() |
| 1905 | + |
| 1906 | + # Delete the ChannelVersion auto-created during setUp so we can insert a |
| 1907 | + # fresh one and observe the snapshot logic. |
| 1908 | + ChannelVersion.objects.filter( |
| 1909 | + channel=self.channel, version=self.channel.version |
| 1910 | + ).delete() |
| 1911 | + |
| 1912 | + cv = ChannelVersion( |
| 1913 | + channel=self.channel, |
| 1914 | + version=self.channel.version, |
| 1915 | + ) |
| 1916 | + cv.save() |
| 1917 | + |
| 1918 | + cv.refresh_from_db() |
| 1919 | + self.assertIsNone(cv.channel_language) |
0 commit comments