source: main/waeup.ikoba/branches/uli-payments/src/waeup/ikoba/customers/tests/test_contract.py @ 12719

Last change on this file since 12719 was 12718, checked in by uli, 10 years ago

contract finder does not complain about missing catalog.

  • Property svn:keywords set to Id
File size: 7.6 KB
Line 
1## $Id: test_contract.py 12718 2015-03-10 15:52:18Z uli $
2##
3## Copyright (C) 2014 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""
19Tests for contracts.
20"""
21import decimal
22from zope.interface.verify import verifyClass, verifyObject
23from zope.component import createObject, getUtility, getUtilitiesFor
24from zope.component.hooks import setSite
25from hurry.workflow.interfaces import (
26    IWorkflowInfo, IWorkflowState, InvalidTransitionError)
27from waeup.ikoba.customers.interfaces import (
28    IContractsContainer, IContract)
29from waeup.ikoba.customers.contracts import (
30    ContractsContainer, SampleContract, payment_items_from_contract,
31    ContractPayer, ContractFinder
32    )
33from waeup.ikoba.app import Company
34from waeup.ikoba.customers.customer import Customer
35from waeup.ikoba.payments.interfaces import (
36    IPaymentItem, IPayer, IPayableFinder,
37    )
38from waeup.ikoba.products.productoptions import ProductOption
39from waeup.ikoba.testing import (FunctionalLayer, FunctionalTestCase)
40
41
42class ContractsContainerTestCase(FunctionalTestCase):
43
44    layer = FunctionalLayer
45
46    def test_interfaces(self):
47        # Make sure the correct interfaces are implemented.
48        self.assertTrue(
49            verifyClass(
50                IContractsContainer, ContractsContainer)
51            )
52        self.assertTrue(
53            verifyObject(
54                IContractsContainer, ContractsContainer())
55            )
56        self.assertTrue(
57            verifyClass(
58                IContract, SampleContract)
59            )
60        self.assertTrue(
61            verifyObject(
62                IContract, SampleContract())
63            )
64        return
65
66    def test_addContract(self):
67        container = ContractsContainer()
68        contract = createObject(u'waeup.SampleContract')
69        id = contract.contract_id
70        container.addContract(contract)
71        self.assertEqual(container[id], contract)
72        self.assertRaises(TypeError, container.addContract, object())
73        self.assertEqual(contract.class_name, 'SampleContract')
74        return
75
76    def test_contract_workflow(self):
77        contract = createObject(u'waeup.SampleContract')
78        IWorkflowInfo(contract).fireTransition('create')
79        self.assertEqual(IWorkflowState(contract).getState(), 'created')
80        IWorkflowInfo(contract).fireTransition('submit')
81        self.assertEqual(IWorkflowState(contract).getState(), 'submitted')
82        IWorkflowInfo(contract).fireTransition('approve')
83        self.assertEqual(IWorkflowState(contract).getState(), 'approved')
84        IWorkflowInfo(contract).fireTransition('expire')
85        self.assertEqual(IWorkflowState(contract).getState(), 'expired')
86        IWorkflowInfo(contract).fireTransition('reset4')
87        self.assertEqual(IWorkflowState(contract).getState(), 'created')
88        self.assertRaises(InvalidTransitionError,
89            IWorkflowInfo(contract).fireTransition, 'approve')
90        IWorkflowInfo(contract).fireTransition('submit')
91        IWorkflowInfo(contract).fireTransition('reset3')
92        self.assertEqual(IWorkflowState(contract).getState(), 'created')
93        return
94
95    def test_contract_history(self):
96        doc = createObject(u'waeup.SampleContract')
97        IWorkflowInfo(doc).fireTransition('create')
98        messages = ' '.join(doc.history.messages)
99        self.assertTrue('Contract created by system' in messages)
100        return
101
102
103class TestContractHelpers(FunctionalTestCase):
104
105    layer = FunctionalLayer
106
107    def test_payment_items_from_contract(self):
108        # we can turn contracts into lists of payment items
109        contract = SampleContract()
110        option1 = ProductOption(u"Fee 1", decimal.Decimal("31.10"), "USD")
111        option2 = ProductOption(u"Fee 2", decimal.Decimal("12.12"), "USD")
112        contract.product_options = [option1, option2]
113        payment_items = payment_items_from_contract(contract)
114        assert len(payment_items) == 2
115        item1, item2 = payment_items
116        assert IPaymentItem.providedBy(item1)
117        assert IPaymentItem.providedBy(item2)
118        assert item1.item_id == "0"
119        assert item2.item_id == "1"
120        assert item1.title == u'Fee 1'
121        assert item2.title == u'Fee 2'
122        assert item1.amount == decimal.Decimal("31.10")
123        assert item2.amount == decimal.Decimal("12.12")
124
125    def test_payment_item_from_contract_no_options(self):
126        # we cope with empty contracts
127        contract = SampleContract()
128        payment_items = payment_items_from_contract(contract)
129        assert payment_items == []
130
131    def test_payer_adapter(self):
132        # we can adapt IContract to IPayer (i.e. create a payer)
133        customer = Customer()
134        customer.firstname, customer.lastname = u'Anna', u'Tester'
135        contract = createObject(u'waeup.SampleContract')
136        customer['contracts'] = ContractsContainer()
137        customer['contracts'].addContract(contract)
138        result = IPayer(contract)
139        self.assertTrue(isinstance(result, ContractPayer))
140        verifyObject(IPayer, result)
141        self.assertEqual(result.first_name, u'Anna')
142        self.assertEqual(result.last_name, u'Tester')
143        self.assertEqual(result.payer_id, customer.customer_id)
144
145    def test_contract_finder_iface(self):
146        # we have a contract finder that returns IPayableFinder data.
147        verifyClass(IPayableFinder, ContractFinder)
148
149    def test_contract_finder_registered(self):
150        # the contract finder is a utility registered on startup
151        util = getUtility(IPayableFinder, name='contracts_finder')
152        self.assertTrue(isinstance(util, ContractFinder))
153        utils = [util for name, util in getUtilitiesFor(IPayableFinder)
154                 if isinstance(util, ContractFinder)]
155        self.assertEqual(len(utils), 1)
156
157    def create_contract_and_site(self):
158        contract = SampleContract()
159        option1 = ProductOption(u"Fee 1", decimal.Decimal("31.10"), "USD")
160        option2 = ProductOption(u"Fee 2", decimal.Decimal("12.12"), "USD")
161        contract.product_options = [option1, option2]
162        contract.contract_id = u'CON1234'
163        self.getRootFolder()['app'] = Company()
164        app = self.getRootFolder()['app']
165        setSite(app)
166        return contract, app
167
168    def test_contract_finder(self):
169        # the contract finder can really find contracts
170        contract, app = self.create_contract_and_site()
171        app['mycontract'] = contract  # trigger cataloging
172        finder = ContractFinder()
173        result = finder.get_payable_by_id('CON1234')
174        self.assertTrue(result is contract)
175
176    def test_contract_finder_not_stored(self):
177        # we get none if an id is not stored
178        contract, app = self.create_contract_and_site()
179        app['mycontract'] = contract  # trigger cataloging
180        finder = ContractFinder()
181        result = finder.get_payable_by_id('Not-a-valid-id')
182        self.assertTrue(result is None)
183
184    def test_contract_finder_no_catalog(self):
185        # contract finder does not complain about missing catalog
186        finder = ContractFinder()
187        result = finder.get_payable_by_id('CON1234')
188        self.assertTrue(result is None)
Note: See TracBrowser for help on using the repository browser.