2 from datetime
import datetime
4 from collections
import Counter
6 from django
.test
import TestCase
, TransactionTestCase
7 from django
.test
.utils
import override_settings
8 from django
.contrib
.auth
import get_user_model
10 from mygpo
.podcasts
.models
import Podcast
, Episode
11 from mygpo
.history
.models
import EpisodeHistoryEntry
12 from mygpo
.maintenance
.merge
import PodcastMerger
19 class SimpleMergeTests(TestCase
):
22 self
.podcast1
= Podcast
.objects
.get_or_create_for_url(
23 'http://example.com/simple-merge-test-feed.rss',
24 defaults
={'title': 'Podcast 1'},
26 self
.podcast2
= Podcast
.objects
.get_or_create_for_url(
27 'http://simple-merge-test.org/podcast/',
28 defaults
={'title': 'Podcast 2'},
31 self
.episode1
= Episode
.objects
.get_or_create_for_url(
32 self
.podcast1
, 'http://example.com/simple-merge-test-episode1.mp3',
34 'title': 'Episode 1 A',
36 self
.episode2
= Episode
.objects
.get_or_create_for_url(
37 self
.podcast2
, 'http://example.com/simple-merge-test-episode1.mp3',
39 'title': 'Episode 1 B',
42 def test_merge_podcasts(self
):
43 # decide which episodes to merge
44 groups
= [(0, [self
.episode1
, self
.episode2
])]
46 pm
= PodcastMerger([self
.podcast1
, self
.podcast2
], counter
, groups
)
50 @override_settings(CACHE
={})
51 class MergeTests(TransactionTestCase
):
52 """ Tests merging of two podcasts, their episodes and states """
55 self
.podcast1
= Podcast
.objects
.get_or_create_for_url(
56 'http://example.com/merge-test-feed.rss',
57 defaults
={'title': 'Podcast 1'},
59 self
.podcast2
= Podcast
.objects
.get_or_create_for_url(
60 'http://merge-test.org/podcast/',
61 defaults
={'title': 'Podcast 2'},
64 self
.episode1
= Episode
.objects
.get_or_create_for_url(
65 self
.podcast1
, 'http://example.com/merge-test-episode1.mp3',
67 'title': 'Episode 1 A',
69 self
.episode2
= Episode
.objects
.get_or_create_for_url(
70 self
.podcast2
, 'http://example.com/merge-test-episode1.mp3',
72 'title': 'Episode 1 B',
75 User
= get_user_model()
76 self
.user
= User(username
='test-merge')
77 self
.user
.email
= 'test-merge-tests@example.com'
78 self
.user
.set_password('secret!')
81 def test_merge_podcasts(self
):
83 action1
= EpisodeHistoryEntry
.create_entry(
86 EpisodeHistoryEntry
.PLAY
,
89 action2
= EpisodeHistoryEntry
.create_entry(
92 EpisodeHistoryEntry
.DOWNLOAD
,
95 # decide which episodes to merge
96 groups
= [(0, [self
.episode1
, self
.episode2
])]
99 pm
= PodcastMerger([self
.podcast1
, self
.podcast2
], counter
, groups
)
102 history
= EpisodeHistoryEntry
.objects
.filter(
103 episode
=self
.episode1
,
107 # both actions must be present for the merged episode
108 self
.assertIn(action1
, history
)
109 self
.assertIn(action2
, history
)
112 self
.episode1
.delete()
113 self
.podcast1
.delete()
117 class MergeGroupTests(TransactionTestCase
):
118 """ Tests merging of two podcasts, one of which is part of a group """
121 self
.podcast1
= Podcast
.objects
.get_or_create_for_url(
122 'http://example.com/group-merge-feed.rss',
124 'title': 'Podcast 1',
127 self
.podcast2
= Podcast
.objects
.get_or_create_for_url(
128 'http://test.org/group-merge-podcast/',
130 'title': 'Podcast 2',
133 self
.podcast3
= Podcast
.objects
.get_or_create_for_url(
134 'http://group-test.org/feed/',
136 'title': 'Podcast 3',
140 self
.episode1
= Episode
.objects
.get_or_create_for_url(
141 self
.podcast1
, 'http://example.com/group-merge-episode1.mp3',
143 'title': 'Episode 1 A',
146 self
.episode2
= Episode
.objects
.get_or_create_for_url(
147 self
.podcast2
, 'http://example.com/group-merge-episode1.mp3',
149 'title': 'Episode 1 B',
152 self
.episode3
= Episode
.objects
.get_or_create_for_url(
153 self
.podcast3
, 'http://example.com/group-merge-media.mp3',
155 'title': 'Episode 2',
159 self
.podcast2
.group_with(self
.podcast3
, 'My Group', 'Feed1', 'Feed2')
161 User
= get_user_model()
162 self
.user
= User(username
='test-merge-group')
163 self
.user
.email
= 'test-merge-group-tests@example.com'
164 self
.user
.set_password('secret!')
167 def test_merge_podcasts(self
):
168 podcast1
= Podcast
.objects
.get(pk
=self
.podcast1
.pk
)
169 podcast2
= Podcast
.objects
.get(pk
=self
.podcast2
.pk
)
170 podcast3
= Podcast
.objects
.get(pk
=self
.podcast3
.pk
)
172 # assert that the podcasts are actually grouped
173 self
.assertEqual(podcast2
.group
, podcast3
.group
)
175 action1
= EpisodeHistoryEntry
.create_entry(
178 EpisodeHistoryEntry
.PLAY
,
181 action2
= EpisodeHistoryEntry
.create_entry(
184 EpisodeHistoryEntry
.DOWNLOAD
,
187 # decide which episodes to merge
188 groups
= [(0, [self
.episode1
, self
.episode2
])]
191 episode2_id
= self
.episode2
.id
193 pm
= PodcastMerger([podcast2
, podcast1
], counter
, groups
)
196 history
= EpisodeHistoryEntry
.objects
.filter(
197 episode
= self
.episode1
,
201 self
.assertIn(action1
, history
)
202 self
.assertIn(action2
, history
)
204 episode1
= Episode
.objects
.get(pk
=self
.episode1
.pk
)
206 # episode2 has been merged into episode1, so it must contain its
208 self
.assertEqual([x
.uuid
for x
in episode1
.merged_uuids
.all()],
212 self
.episode1
.delete()
213 self
.podcast2
.delete()