Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / quotaholder_app / tests.py @ 1e361a6d

History | View | Annotate | Download (10.3 kB)

1 0ee59d55 Giorgos Korfiatis
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2 0ee59d55 Giorgos Korfiatis
#
3 0ee59d55 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
4 0ee59d55 Giorgos Korfiatis
# without modification, are permitted provided that the following
5 0ee59d55 Giorgos Korfiatis
# conditions are met:
6 0ee59d55 Giorgos Korfiatis
#
7 0ee59d55 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
8 0ee59d55 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
9 0ee59d55 Giorgos Korfiatis
#      disclaimer.
10 0ee59d55 Giorgos Korfiatis
#
11 0ee59d55 Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
12 0ee59d55 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
13 0ee59d55 Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
14 0ee59d55 Giorgos Korfiatis
#      provided with the distribution.
15 0ee59d55 Giorgos Korfiatis
#
16 0ee59d55 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 0ee59d55 Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 0ee59d55 Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 0ee59d55 Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 0ee59d55 Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 0ee59d55 Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 0ee59d55 Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 0ee59d55 Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 0ee59d55 Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 0ee59d55 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 0ee59d55 Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 0ee59d55 Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
28 0ee59d55 Giorgos Korfiatis
#
29 0ee59d55 Giorgos Korfiatis
# The views and conclusions contained in the software and
30 0ee59d55 Giorgos Korfiatis
# documentation are those of the authors and should not be
31 0ee59d55 Giorgos Korfiatis
# interpreted as representing official policies, either expressed
32 0ee59d55 Giorgos Korfiatis
# or implied, of GRNET S.A.
33 0ee59d55 Giorgos Korfiatis
34 7bed22fb Giorgos Korfiatis
from django.test import TestCase
35 0ee59d55 Giorgos Korfiatis
36 ec5e00aa Giorgos Korfiatis
import astakos.quotaholder_app.callpoint as qh
37 ec5e00aa Giorgos Korfiatis
from astakos.quotaholder_app.exception import (
38 0ee59d55 Giorgos Korfiatis
    InvalidDataError,
39 0ee59d55 Giorgos Korfiatis
    NoCommissionError,
40 0ee59d55 Giorgos Korfiatis
    NoQuantityError,
41 0ee59d55 Giorgos Korfiatis
    NoCapacityError,
42 0ee59d55 Giorgos Korfiatis
    NoHoldingError,
43 0ee59d55 Giorgos Korfiatis
    DuplicateError)
44 0ee59d55 Giorgos Korfiatis
45 0ee59d55 Giorgos Korfiatis
46 7bed22fb Giorgos Korfiatis
class QuotaholderTest(TestCase):
47 0ee59d55 Giorgos Korfiatis
48 f6e7a826 Giorgos Korfiatis
    def issue_commission(self, provisions, name="", force=False):
49 0ee59d55 Giorgos Korfiatis
        return qh.issue_commission(clientkey=self.client,
50 0ee59d55 Giorgos Korfiatis
                                   name=name,
51 0ee59d55 Giorgos Korfiatis
                                   force=force,
52 0ee59d55 Giorgos Korfiatis
                                   provisions=provisions)
53 0ee59d55 Giorgos Korfiatis
54 7bed22fb Giorgos Korfiatis
    def test_010_qh(self):
55 7bed22fb Giorgos Korfiatis
        holder = 'h0'
56 7bed22fb Giorgos Korfiatis
        source = 'system'
57 7bed22fb Giorgos Korfiatis
        resource1 = 'r1'
58 7bed22fb Giorgos Korfiatis
        resource2 = 'r2'
59 7bed22fb Giorgos Korfiatis
        limit1 = 10
60 7bed22fb Giorgos Korfiatis
        limit2 = 20
61 7bed22fb Giorgos Korfiatis
62 7bed22fb Giorgos Korfiatis
        qh.set_quota([((holder, source, resource1), limit1),
63 7bed22fb Giorgos Korfiatis
                      ((holder, source, resource1), limit2)])
64 7bed22fb Giorgos Korfiatis
65 7bed22fb Giorgos Korfiatis
        r = qh.get_quota(holders=[holder], sources=[source],
66 7bed22fb Giorgos Korfiatis
                         resources=[resource1, resource2])
67 7bed22fb Giorgos Korfiatis
        self.assertEqual(r, {(holder, source, resource1): (limit2, 0, 0)})
68 7bed22fb Giorgos Korfiatis
69 7bed22fb Giorgos Korfiatis
        r = qh.get_quota()
70 7bed22fb Giorgos Korfiatis
        self.assertEqual(r, {(holder, source, resource1): (limit2, 0, 0)})
71 7bed22fb Giorgos Korfiatis
72 7bed22fb Giorgos Korfiatis
        # issueing commissions
73 0ee59d55 Giorgos Korfiatis
74 0ee59d55 Giorgos Korfiatis
        qh.set_quota([((holder, source, resource1), limit1),
75 0ee59d55 Giorgos Korfiatis
                      ((holder, source, resource2), limit2)])
76 0ee59d55 Giorgos Korfiatis
77 0ee59d55 Giorgos Korfiatis
        s1 = self.issue_commission([((holder, source, resource1), limit1/2),
78 0ee59d55 Giorgos Korfiatis
                                    ((holder, source, resource2), limit2)],
79 0ee59d55 Giorgos Korfiatis
                                   name="initial")
80 0ee59d55 Giorgos Korfiatis
        self.assertGreater(s1, 0)
81 0ee59d55 Giorgos Korfiatis
82 0ee59d55 Giorgos Korfiatis
        r = qh.get_commission(self.client, s1)
83 0ee59d55 Giorgos Korfiatis
        provisions = [
84 0ee59d55 Giorgos Korfiatis
            {'holder': holder,
85 0ee59d55 Giorgos Korfiatis
             'source': source,
86 0ee59d55 Giorgos Korfiatis
             'resource': resource1,
87 0ee59d55 Giorgos Korfiatis
             'quantity': limit1/2,
88 0ee59d55 Giorgos Korfiatis
             },
89 0ee59d55 Giorgos Korfiatis
            {'holder': holder,
90 0ee59d55 Giorgos Korfiatis
             'source': source,
91 0ee59d55 Giorgos Korfiatis
             'resource': resource2,
92 0ee59d55 Giorgos Korfiatis
             'quantity': limit2,
93 0ee59d55 Giorgos Korfiatis
             }
94 0ee59d55 Giorgos Korfiatis
        ]
95 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r['serial'], s1)
96 0ee59d55 Giorgos Korfiatis
        ps = r['provisions']
97 0ee59d55 Giorgos Korfiatis
        for p in ps:
98 0ee59d55 Giorgos Korfiatis
            self.assertIn(p, provisions)
99 0ee59d55 Giorgos Korfiatis
100 0ee59d55 Giorgos Korfiatis
        with self.assertRaises(NoCommissionError):
101 0ee59d55 Giorgos Korfiatis
            qh.get_commission(self.client, s1+1)
102 0ee59d55 Giorgos Korfiatis
103 7bed22fb Giorgos Korfiatis
        # commission exceptions
104 0ee59d55 Giorgos Korfiatis
105 0ee59d55 Giorgos Korfiatis
        with self.assertRaises(NoCapacityError) as cm:
106 0ee59d55 Giorgos Korfiatis
            self.issue_commission([((holder, source, resource1), 1),
107 0ee59d55 Giorgos Korfiatis
                                   ((holder, source, resource2), 1)])
108 0ee59d55 Giorgos Korfiatis
109 0ee59d55 Giorgos Korfiatis
        e = cm.exception
110 0ee59d55 Giorgos Korfiatis
        provision = e.data['provision']
111 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['holder'], holder)
112 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['source'], source)
113 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['resource'], resource2)
114 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['quantity'], 1)
115 0ee59d55 Giorgos Korfiatis
        self.assertEqual(e.data['usage'], limit2)
116 0ee59d55 Giorgos Korfiatis
        self.assertEqual(e.data['limit'], limit2)
117 0ee59d55 Giorgos Korfiatis
118 0ee59d55 Giorgos Korfiatis
        with self.assertRaises(NoQuantityError) as cm:
119 0ee59d55 Giorgos Korfiatis
            self.issue_commission([((holder, source, resource1), -1)])
120 0ee59d55 Giorgos Korfiatis
121 0ee59d55 Giorgos Korfiatis
        e = cm.exception
122 0ee59d55 Giorgos Korfiatis
        provision = e.data['provision']
123 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['holder'], holder)
124 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['source'], source)
125 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['resource'], resource1)
126 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['quantity'], -1)
127 3a8e56bc Giorgos Korfiatis
        self.assertEqual(e.data['usage'], 0)
128 3a8e56bc Giorgos Korfiatis
        self.assertEqual(e.data['limit'], 0)
129 0ee59d55 Giorgos Korfiatis
130 0ee59d55 Giorgos Korfiatis
        with self.assertRaises(NoHoldingError) as cm:
131 0ee59d55 Giorgos Korfiatis
            self.issue_commission([((holder, source, resource1), 1),
132 0ee59d55 Giorgos Korfiatis
                                   (('nonex', source, resource1), 1)])
133 0ee59d55 Giorgos Korfiatis
134 0ee59d55 Giorgos Korfiatis
        e = cm.exception
135 0ee59d55 Giorgos Korfiatis
        provision = e.data['provision']
136 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['holder'], 'nonex')
137 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['source'], source)
138 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['resource'], resource1)
139 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['quantity'], 1)
140 0ee59d55 Giorgos Korfiatis
141 0ee59d55 Giorgos Korfiatis
        with self.assertRaises(DuplicateError) as cm:
142 0ee59d55 Giorgos Korfiatis
            self.issue_commission([((holder, source, resource1), 1),
143 0ee59d55 Giorgos Korfiatis
                                   ((holder, source, resource1), 2)])
144 0ee59d55 Giorgos Korfiatis
145 0ee59d55 Giorgos Korfiatis
        e = cm.exception
146 0ee59d55 Giorgos Korfiatis
        provision = e.data['provision']
147 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['holder'], holder)
148 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['source'], source)
149 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['resource'], resource1)
150 0ee59d55 Giorgos Korfiatis
        self.assertEqual(provision['quantity'], 2)
151 0ee59d55 Giorgos Korfiatis
152 0ee59d55 Giorgos Korfiatis
        with self.assertRaises(InvalidDataError):
153 0ee59d55 Giorgos Korfiatis
            self.issue_commission([((holder, source, resource1), 1),
154 0ee59d55 Giorgos Korfiatis
                                   ((holder, source, resource1), "nan")])
155 0ee59d55 Giorgos Korfiatis
156 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder])
157 0ee59d55 Giorgos Korfiatis
        quotas = {(holder, source, resource1): (limit1, 0, limit1/2),
158 0ee59d55 Giorgos Korfiatis
                  (holder, source, resource2): (limit2, 0, limit2),
159 0ee59d55 Giorgos Korfiatis
                  }
160 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
161 0ee59d55 Giorgos Korfiatis
162 7bed22fb Giorgos Korfiatis
        # resolve commission
163 0ee59d55 Giorgos Korfiatis
164 0ee59d55 Giorgos Korfiatis
        r = qh.get_pending_commissions(clientkey=self.client)
165 0ee59d55 Giorgos Korfiatis
        self.assertEqual(len(r), 1)
166 0ee59d55 Giorgos Korfiatis
        serial = r[0]
167 0ee59d55 Giorgos Korfiatis
        r = qh.resolve_pending_commission(self.client, serial)
168 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, True)
169 0ee59d55 Giorgos Korfiatis
        r = qh.get_pending_commissions(clientkey=self.client)
170 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, [])
171 0ee59d55 Giorgos Korfiatis
        r = qh.resolve_pending_commission(self.client, serial)
172 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, False)
173 0ee59d55 Giorgos Korfiatis
174 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder])
175 0ee59d55 Giorgos Korfiatis
        quotas = {(holder, source, resource1): (limit1, limit1/2, limit1/2),
176 0ee59d55 Giorgos Korfiatis
                  (holder, source, resource2): (limit2, limit2, limit2),
177 0ee59d55 Giorgos Korfiatis
                  }
178 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
179 0ee59d55 Giorgos Korfiatis
180 7bed22fb Giorgos Korfiatis
        # resolve commissions
181 0ee59d55 Giorgos Korfiatis
182 0ee59d55 Giorgos Korfiatis
        serial = self.issue_commission([((holder, source, resource1), 1),
183 0ee59d55 Giorgos Korfiatis
                                        ((holder, source, resource2), -1)])
184 0ee59d55 Giorgos Korfiatis
185 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder])
186 0ee59d55 Giorgos Korfiatis
        quotas = {(holder, source, resource1): (limit1, limit1/2, limit1/2+1),
187 0ee59d55 Giorgos Korfiatis
                  (holder, source, resource2): (limit2, limit2-1, limit2),
188 0ee59d55 Giorgos Korfiatis
                  }
189 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
190 0ee59d55 Giorgos Korfiatis
191 0ee59d55 Giorgos Korfiatis
        r = qh.resolve_pending_commission(self.client, serial, accept=False)
192 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, True)
193 0ee59d55 Giorgos Korfiatis
194 0ee59d55 Giorgos Korfiatis
        serial1 = self.issue_commission([((holder, source, resource1), 1),
195 0ee59d55 Giorgos Korfiatis
                                         ((holder, source, resource2), -1)])
196 0ee59d55 Giorgos Korfiatis
197 0ee59d55 Giorgos Korfiatis
        serial2 = self.issue_commission([((holder, source, resource1), 1),
198 0ee59d55 Giorgos Korfiatis
                                         ((holder, source, resource2), -1)])
199 0ee59d55 Giorgos Korfiatis
200 0ee59d55 Giorgos Korfiatis
        serial3 = self.issue_commission([((holder, source, resource1), 1),
201 0ee59d55 Giorgos Korfiatis
                                         ((holder, source, resource2), -1)])
202 0ee59d55 Giorgos Korfiatis
203 0ee59d55 Giorgos Korfiatis
        r = qh.resolve_pending_commissions(clientkey=self.client,
204 0ee59d55 Giorgos Korfiatis
                                           accept_set=[serial1, serial2, 0],
205 0ee59d55 Giorgos Korfiatis
                                           reject_set=[serial2, serial3])
206 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, ([serial1], [serial3], [0], [serial2]))
207 0ee59d55 Giorgos Korfiatis
208 0ee59d55 Giorgos Korfiatis
        r = qh.get_pending_commissions(clientkey=self.client)
209 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, [serial2])
210 0ee59d55 Giorgos Korfiatis
211 7bed22fb Giorgos Korfiatis
        # forced commission
212 0ee59d55 Giorgos Korfiatis
213 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder])
214 0ee59d55 Giorgos Korfiatis
        quotas = {
215 0ee59d55 Giorgos Korfiatis
            (holder, source, resource1): (limit1, limit1/2+1, limit1/2+2),
216 0ee59d55 Giorgos Korfiatis
            (holder, source, resource2): (limit2, limit2-2, limit2-1),
217 0ee59d55 Giorgos Korfiatis
        }
218 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
219 0ee59d55 Giorgos Korfiatis
220 0ee59d55 Giorgos Korfiatis
        with self.assertRaises(NoCapacityError):
221 0ee59d55 Giorgos Korfiatis
            self.issue_commission(
222 0ee59d55 Giorgos Korfiatis
                [((holder, source, resource1), limit1/2+1)])
223 0ee59d55 Giorgos Korfiatis
224 0ee59d55 Giorgos Korfiatis
        serial = self.issue_commission(
225 0ee59d55 Giorgos Korfiatis
            [((holder, source, resource1), limit1/2+1)],
226 0ee59d55 Giorgos Korfiatis
            force=True)
227 0ee59d55 Giorgos Korfiatis
228 0ee59d55 Giorgos Korfiatis
        r = qh.resolve_pending_commission(self.client, serial, accept=True)
229 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, True)
230 0ee59d55 Giorgos Korfiatis
231 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder])
232 0ee59d55 Giorgos Korfiatis
        quotas = {
233 0ee59d55 Giorgos Korfiatis
            (holder, source, resource1): (limit1, limit1+2, limit1+3),
234 0ee59d55 Giorgos Korfiatis
            (holder, source, resource2): (limit2, limit2-2, limit2-1),
235 0ee59d55 Giorgos Korfiatis
        }
236 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
237 0ee59d55 Giorgos Korfiatis
238 7bed22fb Giorgos Korfiatis
        # release off upper limit
239 0ee59d55 Giorgos Korfiatis
240 0ee59d55 Giorgos Korfiatis
        serial = self.issue_commission([((holder, source, resource1), -1)])
241 0ee59d55 Giorgos Korfiatis
        r = qh.resolve_pending_commission(self.client, serial)
242 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, True)
243 0ee59d55 Giorgos Korfiatis
244 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder], resources=[resource1])
245 0ee59d55 Giorgos Korfiatis
        quotas = {
246 0ee59d55 Giorgos Korfiatis
            (holder, source, resource1): (limit1, limit1+1, limit1+2),
247 0ee59d55 Giorgos Korfiatis
        }
248 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
249 0ee59d55 Giorgos Korfiatis
250 7bed22fb Giorgos Korfiatis
        # add resource limit
251 0ee59d55 Giorgos Korfiatis
252 0ee59d55 Giorgos Korfiatis
        qh.add_resource_limit(sources=[source], resources=[resource1], diff=1)
253 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder])
254 0ee59d55 Giorgos Korfiatis
        quotas = {
255 0ee59d55 Giorgos Korfiatis
            (holder, source, resource1): (limit1+1, limit1+1, limit1+2),
256 0ee59d55 Giorgos Korfiatis
            (holder, source, resource2): (limit2, limit2-2, limit2-1),
257 0ee59d55 Giorgos Korfiatis
        }
258 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
259 0ee59d55 Giorgos Korfiatis
260 0ee59d55 Giorgos Korfiatis
        qh.add_resource_limit(holders=[holder, "nonex"], diff=10)
261 0ee59d55 Giorgos Korfiatis
        r = qh.get_quota(holders=[holder, "nonex"])
262 0ee59d55 Giorgos Korfiatis
        quotas = {
263 0ee59d55 Giorgos Korfiatis
            (holder, source, resource1): (limit1+11, limit1+1, limit1+2),
264 0ee59d55 Giorgos Korfiatis
            (holder, source, resource2): (limit2+10, limit2-2, limit2-1),
265 0ee59d55 Giorgos Korfiatis
        }
266 0ee59d55 Giorgos Korfiatis
        self.assertEqual(r, quotas)
267 7585a768 Giorgos Korfiatis
268 7585a768 Giorgos Korfiatis
    def test_020_empty_provisions(self):
269 7585a768 Giorgos Korfiatis
        serial = self.issue_commission([])
270 7585a768 Giorgos Korfiatis
        r = qh.resolve_pending_commission(self.client, serial)
271 7585a768 Giorgos Korfiatis
        self.assertEqual(r, True)