Completed
Push — master ( 85c135...42304c )
by
unknown
01:17
created

TestAtomFeedViews.test_get_last_atom_feed()   A

Complexity

Conditions 1

Size

Total Lines 10

Duplication

Lines 8
Ratio 80 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 8
loc 10
rs 9.4285
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.rest_views = TestAtomFeedView(self.request)
75
        self.min_max = self.session.query(func.min(Feed.id), func.max(Feed.id)).one()
76
77
    def route_url_side_effect(self, route_name, **kwargs):
78
        response = route_name
79
        for arg in kwargs:
80
            response += '__' + arg + '_' + str(kwargs[arg])
81
        return response
82
83
    def tearDown(self):
84
        for file_to_clean in self.files_to_clean:
85
            if os.path.isfile(file_to_clean):
86
                os.remove(file_to_clean)
87
        self.session.rollback()
88
        self.session.close()
89
90
    def test_get_current_atom_feed(self):
91
        response = self.rest_views.get_current_atom_feed()
92
        self.assertEqual(response, text_('test__id_2'))
93
94
    def test_can_get_current_atom_feed_by_id(self):
95
        feed_id = self.atom_feed_manager.current_feed.id
96
        self.request.matchdict = {'id': str(feed_id)}
97
        response = self.rest_views.get_atom_feed()
98
        self.assertIn(text_('<id>test__id_2</id>'), text_(response))
99
100
    @patch('oe_utils.data.data_managers.AtomFeedManager.current_feed')
101
    @patch('oe_utils.data.data_managers.AtomFeedManager.get_from_archive')
102
    def test_get_archived_atom_feed(self, get_from_archive_mock, current_feed_mock):
103
        self.request.matchdict['id'] = '1'
104
        current_feed_mock.id = 15
105
        get_from_archive_mock.return_value = 'whatever'
106
        response = self.rest_views.get_atom_feed()
107
        get_from_archive_mock.assert_called_once_with(1)
108
        self.assertIsNotNone(response)
109
        self.assertEqual(response, text_('whatever'))
110
111
    @patch('oe_utils.data.data_managers.AtomFeedManager.current_feed')
112
    @patch('oe_utils.data.data_managers.AtomFeedManager.get_from_archive')
113
    def test_get_archived_atom_feed_not_existing(self, get_from_archive_mock, current_feed_mock):
114
        self.request.matchdict['id'] = '1'
115
        current_feed_mock.id = 15
116
117
        def side_effect(*args, **kwargs):
118
            raise FeedArchiveNotFound()
119
120
        get_from_archive_mock.side_effect = side_effect
121
        with self.assertRaises(FeedArchiveNotFound):
122
            self.rest_views.get_atom_feed()
123
        get_from_archive_mock.assert_called_once_with(1)
124
125
    def test_archive_current_feed(self):
126
        old_current_id = self.atom_feed_manager.current_feed.id
127
        feed_archive_path = fixture_directory + '/' + str(old_current_id) + '.xml'
128
        m = mock_open()
129
        with patch.object(builtins, 'open', m):
130
            self.rest_views.archive_current_feed()
131
        m.assert_called_once_with(feed_archive_path, 'w')
132
        handle = m()
133
        self.assertTrue(handle.write.called)
134
        new_current_id = self.atom_feed_manager.current_feed.id
135
        self.assertNotEqual(new_current_id, old_current_id)
136
        self.request.route_url.assert_has_calls([call('test', id=new_current_id)])
137
138
    def validate_atom_feed(self, feed, atom_feed, siblings={}):
139
        self.assertEqual(atom_feed.id(), 'test__id_' + str(feed.id))
140
        atom_feed_url = atom_feed.link()[0]
141
        self.assertEqual(atom_feed_url['href'], 'test__id_' + str(feed.id))
142
        self.assertEqual(atom_feed_url['rel'], 'self')
143
        self.assertEqual(atom_feed.title(), 'Feed test')
144
        route_calls = [call('test', id=feed.id)]
145
        if 'previous' in siblings:
146
            route_calls.append(call('test', id=siblings['previous']))
147
        if 'next' in siblings:
148 View Code Duplication
            route_calls.append(call('test', id=siblings['next']))
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
149
150
    def test_get_first_atom_feed(self):
151
        feed = self.session.query(Feed).filter(Feed.id == self.min_max[0]).one()
152
        self.request.matchdict = {'id': feed.id}
153
        atom_feed = self.rest_views.generate_atom_feed(feed)
154
        next_id = feed.id + 1
155
        self.validate_atom_feed(feed, atom_feed, {'next': next_id})
156
        self.assertEqual(len(atom_feed.link()), 2)
157
        link = atom_feed.link()[1]
158
        self.assertIsInstance(link, dict)
159
        self.assertEqual(link['rel'], 'next-archive')
160 View Code Duplication
        self.assertEqual(link['href'], 'test__id_' + str(next_id))
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
161
162
    def test_get_last_atom_feed(self):
163
        feed = self.session.query(Feed).filter(Feed.id == self.min_max[1]).one()
164
        atom_feed = self.rest_views.generate_atom_feed(feed)
165
        previous_id = feed.id - 1
166
        self.validate_atom_feed(feed, atom_feed, {'previous': previous_id})
167
        self.assertEqual(len(atom_feed.link()), 2)
168
        link = atom_feed.link()[1]
169
        self.assertIsInstance(link, dict)
170
        self.assertEqual(link['rel'], 'prev-archive')
171
        self.assertEqual(link['href'], 'test__id_' + str(previous_id))
172
173
    def test_get_atom_feed_entry(self):
174
        entry = self.session.query(FeedEntry).first()
175
        self.request.matchdict['id'] = entry.id
176
        entry2 = self.rest_views.get_atom_feed_entry()
177
        self.assertEqual(entry2, entry)
178
179
    def test_default_generate_atomfeed(self):
180
        atom_feed_view = AtomFeedView(self.request, self.atom_feed_manager, 'test')
181
        feed = self.session.query(Feed).filter(Feed.id == self.min_max[1]).one()
182
        atom_feed = atom_feed_view.generate_atom_feed(feed)
183
        self.assertEqual(atom_feed.id(), 'test__id_' + str(feed.id))
184
        atom_feed_url = atom_feed.link()[0]
185
        self.assertEqual(atom_feed_url['href'], 'test__id_' + str(feed.id))
186
        self.assertEqual(atom_feed_url['rel'], 'self')
187
        self.assertEqual(atom_feed.title(), 'Feed')
188