TestAtomFeedView   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 14
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 14
rs 10
wmc 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A generate_atom_feed() 0 4 1
A __init__() 0 6 1
1
# -*- coding: utf-8 -*-
2
import os
3
import unittest
4
5
from sqlalchemy.orm import sessionmaker
6
from pyramid.compat import text_
7
8
from oe_utils.views.atom import AtomFeedView
9
from oe_utils.data.data_managers import AtomFeedManager, FeedArchiveNotFound
10
from mock import mock_open
11
12
try:
13
    from unittest.mock import Mock, patch, MagicMock, call
14
except ImportError:
15
    from mock import Mock, patch, MagicMock, call  # pragma: no cover
16
from sys import version_info
17
if version_info.major == 2:
18
    import __builtin__ as builtins  # pragma: no cover
19
else:
20
    import builtins
21
import tempfile
22
try:
23
    from initfeedgen import fill_db_feeds, Feed, FeedEntry
24
except:
25
    from tests.initfeedgen import fill_db_feeds, Feed, FeedEntry
26
from sqlalchemy import func, engine_from_config
27
try:
28
    import configparser
29
except ImportError:
30
    import ConfigParser as configparser
31
32
33
here = os.path.dirname(os.path.abspath(__file__))
34
settings = {"sqlalchemy.url": "sqlite:///{}/test.sqlite".format(here)}
35
engine = engine_from_config(settings, prefix='sqlalchemy.')
36
here = os.path.dirname(os.path.abspath(__file__))
37
fixture_directory = tempfile.gettempdir()
38
39
40
class TestAtomFeedView(AtomFeedView):
41
42
    def __init__(self, request):
43
        super(TestAtomFeedView, self).__init__(
44
            request=request,
45
            atom_feed_manager=request.data_managers['atom_feed_manager'],
46
            get_atom_feed_url='test',
47
            generate_atom_feed=self.generate_atom_feed
48
        )
49
50
    def generate_atom_feed(self, feed):
51
        atom_feed = self.init_atom_feed(feed)
52
        atom_feed.title("Feed test")
53
        return atom_feed
54
55
56
def setUpModule():
57
    fill_db_feeds(engine)
58
59
60
class TestAtomFeedViews(unittest.TestCase):
61
62
    def setUp(self):
63
        session_maker = sessionmaker(
64
            bind=engine
65
        )
66
        self.session = session_maker()
67
        self.atom_feed_manager = AtomFeedManager(self.session, fixture_directory, Feed, FeedEntry)
68
        self.files_to_clean = []
69
70
        self.request = MagicMock()
71
        self.request.data_managers = {'atom_feed_manager': self.atom_feed_manager}
72
        self.request.route_url = MagicMock(side_effect=self.route_url_side_effect)
73
        self.request.matchdict = {'id': '1'}
74
        self.request.registry.settings = {'feed.archive.split': '4'}
75
        self.rest_views = TestAtomFeedView(self.request)
76
        self.min_max = self.session.query(func.min(Feed.id), func.max(Feed.id)).one()
77
78
    def route_url_side_effect(self, route_name, **kwargs):
79
        response = route_name
80
        for arg in kwargs:
81
            response += '__' + arg + '_' + str(kwargs[arg])
82
        return response
83
84
    def tearDown(self):
85
        for file_to_clean in self.files_to_clean:
86
            if os.path.isfile(file_to_clean):
87
                os.remove(file_to_clean)
88
        self.session.rollback()
89
        self.session.close()
90
91
    def test_get_current_atom_feed(self):
92
        response = self.rest_views.get_current_atom_feed()
93
        self.assertEqual(response, text_('test__id_2'))
94
95
    def test_can_get_current_atom_feed_by_id(self):
96
        feed_id = self.atom_feed_manager.current_feed.id
97
        self.request.matchdict = {'id': str(feed_id)}
98
        response = self.rest_views.get_atom_feed()
99
        self.assertIn(text_('<id>test__id_2</id>'), text_(response))
100
101
    @patch('oe_utils.data.data_managers.AtomFeedManager.current_feed')
102
    @patch('oe_utils.data.data_managers.AtomFeedManager.get_from_archive')
103
    def test_get_archived_atom_feed(self, get_from_archive_mock, current_feed_mock):
104
        self.request.matchdict['id'] = '1'
105
        current_feed_mock.id = 15
106
        get_from_archive_mock.return_value = 'whatever'
107
        response = self.rest_views.get_atom_feed()
108
        get_from_archive_mock.assert_called_once_with(1)
109
        self.assertIsNotNone(response)
110
        self.assertEqual(response, text_('whatever'))
111
112
    @patch('oe_utils.data.data_managers.AtomFeedManager.current_feed')
113
    @patch('oe_utils.data.data_managers.AtomFeedManager.get_from_archive')
114
    def test_get_archived_atom_feed_not_existing(self, get_from_archive_mock, current_feed_mock):
115
        self.request.matchdict['id'] = '1'
116
        current_feed_mock.id = 15
117
118
        def side_effect(*args, **kwargs):
119
            raise FeedArchiveNotFound()
120
121
        get_from_archive_mock.side_effect = side_effect
122
        with self.assertRaises(FeedArchiveNotFound):
123
            self.rest_views.get_atom_feed()
124
        get_from_archive_mock.assert_called_once_with(1)
125
126 View Code Duplication
    def test_archive_split_current_feed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
127
        old_current_id = self.atom_feed_manager.current_feed.id
128
        feed_archive_path = fixture_directory + '/' + str(old_current_id) + '.xml'
129
        m = mock_open()
130
        with patch.object(builtins, 'open', m):
131
            self.rest_views.archive_current_feed()
132
        m.assert_has_calls(call(feed_archive_path, 'w'))
133
        handle = m()
134
        self.assertTrue(handle.write.called)
135
        new_current_id = self.atom_feed_manager.current_feed.id
136
        self.assertNotEqual(new_current_id, old_current_id)
137
        self.request.route_url.assert_has_calls([call('test', id=new_current_id)])
138
        self.assertEqual(2, len(self.atom_feed_manager.current_feed.entries))
139
140 View Code Duplication
    def test_archive_current_feed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
141
        self.request.registry.settings['feed.archive.split'] = None
142
        old_current_id = self.atom_feed_manager.current_feed.id
143
        feed_archive_path = fixture_directory + '/' + str(old_current_id) + '.xml'
144
        m = mock_open()
145
        with patch.object(builtins, 'open', m):
146
            self.rest_views.archive_current_feed()
147
        m.assert_called_once_with(feed_archive_path, 'w')
148
        handle = m()
149
        self.assertTrue(handle.write.called)
150
        new_current_id = self.atom_feed_manager.current_feed.id
151
        self.assertNotEqual(new_current_id, old_current_id)
152
        self.request.route_url.assert_has_calls([call('test', id=new_current_id)])
153
154
    def validate_atom_feed(self, feed, atom_feed, siblings={}):
155
        self.assertEqual(atom_feed.id(), 'test__id_' + str(feed.id))
156
        atom_feed_url = atom_feed.link()[0]
157
        self.assertEqual(atom_feed_url['href'], 'test__id_' + str(feed.id))
158
        self.assertEqual(atom_feed_url['rel'], 'self')
159
        self.assertEqual(atom_feed.title(), 'Feed test')
160
        route_calls = [call('test', id=feed.id)]
161
        if 'previous' in siblings:
162
            route_calls.append(call('test', id=siblings['previous']))
163
        if 'next' in siblings:
164
            route_calls.append(call('test', id=siblings['next']))
165
166 View Code Duplication
    def test_get_first_atom_feed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
167
        feed = self.session.query(Feed).filter(Feed.id == self.min_max[0]).one()
168
        self.request.matchdict = {'id': feed.id}
169
        atom_feed = self.rest_views.generate_atom_feed(feed)
170
        next_id = feed.id + 1
171
        self.validate_atom_feed(feed, atom_feed, {'next': next_id})
172
        self.assertEqual(len(atom_feed.link()), 2)
173
        link = atom_feed.link()[1]
174
        self.assertIsInstance(link, dict)
175
        self.assertEqual(link['rel'], 'next-archive')
176
        self.assertEqual(link['href'], 'test__id_' + str(next_id))
177
178 View Code Duplication
    def test_get_last_atom_feed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
179
        feed = self.session.query(Feed).filter(Feed.id == self.min_max[1]).one()
180
        atom_feed = self.rest_views.generate_atom_feed(feed)
181
        previous_id = feed.id - 1
182
        self.validate_atom_feed(feed, atom_feed, {'previous': previous_id})
183
        self.assertEqual(len(atom_feed.link()), 2)
184
        link = atom_feed.link()[1]
185
        self.assertIsInstance(link, dict)
186
        self.assertEqual(link['rel'], 'prev-archive')
187
        self.assertEqual(link['href'], 'test__id_' + str(previous_id))
188
189
    def test_get_atom_feed_entry(self):
190
        entry = self.session.query(FeedEntry).first()
191
        self.request.matchdict['id'] = entry.id
192
        entry2 = self.rest_views.get_atom_feed_entry()
193
        self.assertEqual(entry2, entry)
194
195
    def test_default_generate_atomfeed(self):
196
        atom_feed_view = AtomFeedView(self.request, self.atom_feed_manager, 'test')
197
        feed = self.session.query(Feed).filter(Feed.id == self.min_max[1]).one()
198
        atom_feed = atom_feed_view.generate_atom_feed(feed)
199
        self.assertEqual(atom_feed.id(), 'test__id_' + str(feed.id))
200
        atom_feed_url = atom_feed.link()[0]
201
        self.assertEqual(atom_feed_url['href'], 'test__id_' + str(feed.id))
202
        self.assertEqual(atom_feed_url['rel'], 'self')
203
        self.assertEqual(atom_feed.title(), 'Feed')
204