Completed
Push — master ( e43325...f31dcf )
by
unknown
01:16
created

TestAtomFeedViews.test_get_atom_feed_entry()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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