Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle 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 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle 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 Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
/**
18
 * Testing helper class methods in payments API
19
 *
20
 * @package    core_payment
21
 * @category   test
22
 * @copyright  2020 Marina Glancy
23
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24
 */
25
 
26
namespace core_payment;
27
 
28
use advanced_testcase;
29
use core\plugininfo\paygw;
30
 
31
/**
32
 * Testing helper class methods in payments API
33
 *
34
 * @package    core_payment
35
 * @category   test
36
 * @copyright  2020 Marina Glancy
37
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38
 */
39
class helper_test extends advanced_testcase {
40
 
41
    protected function enable_paypal_gateway(): bool {
42
        if (!array_key_exists('paypal', \core_component::get_plugin_list('paygw'))) {
43
            return false;
44
        }
45
        return true;
46
    }
47
 
11 efrain 48
    public function test_create_account(): void {
1 efrain 49
        global $DB;
50
        $this->resetAfterTest();
51
 
52
        $account = helper::save_payment_account((object)['name' => 'Test 1', 'idnumber' => '']);
53
        $this->assertNotEmpty($account->get('id'));
54
        $this->assertEquals('Test 1', $DB->get_field('payment_accounts', 'name', ['id' => $account->get('id')]));
55
    }
56
 
11 efrain 57
    public function test_update_account_details(): void {
1 efrain 58
        global $DB;
59
        $this->resetAfterTest();
60
 
61
        $account = helper::save_payment_account((object)['name' => 'Test 1', 'idnumber' => '']);
62
        $record = $account->to_record();
63
        $record->name = 'Edited name';
64
        $editedaccount = helper::save_payment_account($record);
65
        $this->assertEquals($account->get('id'), $editedaccount->get('id'));
66
        $this->assertEquals('Edited name', $DB->get_field('payment_accounts', 'name', ['id' => $account->get('id')]));
67
    }
68
 
11 efrain 69
    public function test_update_account_gateways(): void {
1 efrain 70
        global $DB;
71
        if (!$this->enable_paypal_gateway()) {
72
            $this->markTestSkipped('Paypal payment gateway plugin not found');
73
        }
74
 
75
        $this->resetAfterTest();
76
 
77
        $account = helper::save_payment_account((object)['name' => 'Test 1', 'idnumber' => '']);
78
        $gateway = helper::save_payment_gateway(
79
            (object)['accountid' => $account->get('id'), 'gateway' => 'paypal', 'config' => 'T1']);
80
        $this->assertNotEmpty($gateway->get('id'));
81
        $this->assertEquals('T1', $DB->get_field('payment_gateways', 'config', ['id' => $gateway->get('id')]));
82
 
83
        // Update by id.
84
        $editedgateway = helper::save_payment_gateway(
85
            (object)['id' => $gateway->get('id'), 'accountid' => $account->get('id'), 'gateway' => 'paypal', 'config' => 'T2']);
86
        $this->assertEquals($gateway->get('id'), $editedgateway->get('id'));
87
        $this->assertEquals('T2', $DB->get_field('payment_gateways', 'config', ['id' => $gateway->get('id')]));
88
 
89
        // Update by account/gateway.
90
        $editedgateway = helper::save_payment_gateway(
91
            (object)['accountid' => $account->get('id'), 'gateway' => 'paypal', 'config' => 'T3']);
92
        $this->assertEquals($gateway->get('id'), $editedgateway->get('id'));
93
        $this->assertEquals('T3', $DB->get_field('payment_gateways', 'config', ['id' => $gateway->get('id')]));
94
    }
95
 
11 efrain 96
    public function test_delete_account(): void {
1 efrain 97
        global $DB;
98
        if (!$this->enable_paypal_gateway()) {
99
            $this->markTestSkipped('Paypal payment gateway plugin not found');
100
        }
101
        $this->resetAfterTest();
102
 
103
        // Delete account without payments, it will be deleted, gateways will also be deleted.
104
        $account = helper::save_payment_account((object)['name' => 'Test 1', 'idnumber' => '']);
105
        $gateway = helper::save_payment_gateway(
106
            (object)['accountid' => $account->get('id'), 'gateway' => 'paypal', 'config' => 'T1']);
107
 
108
        helper::delete_payment_account(account::get_record(['id' => $account->get('id')]));
109
        $this->assertEmpty($DB->get_records('payment_accounts', ['id' => $account->get('id')]));
110
        $this->assertEmpty($DB->get_records('payment_gateways', ['id' => $gateway->get('id')]));
111
    }
112
 
11 efrain 113
    public function test_archive_restore_account(): void {
1 efrain 114
        global $DB, $USER;
115
        $this->resetAfterTest();
116
 
117
        // Delete account with payments - it will be archived.
118
        $this->setAdminUser();
119
        $account = helper::save_payment_account((object)['name' => 'Test 1', 'idnumber' => '']);
120
        $DB->insert_record('payments', [
121
            'accountid' => $account->get('id'),
122
            'component' => 'test',
123
            'paymentarea' => 'test',
124
            'itemid' => 1,
125
            'userid' => $USER->id,
126
        ]);
127
        helper::delete_payment_account(account::get_record(['id' => $account->get('id')]));
128
        $this->assertEquals(1, $DB->get_field('payment_accounts', 'archived', ['id' => $account->get('id')]));
129
 
130
        // Restore account.
131
        helper::restore_payment_account(account::get_record(['id' => $account->get('id')]));
132
        $this->assertEquals(0, $DB->get_field('payment_accounts', 'archived', ['id' => $account->get('id')]));
133
    }
134
 
135
    /**
136
     * Provider for format_cost test
137
     *
138
     * @return array
139
     */
140
    public function get_rounded_cost_provider(): array {
141
        return [
142
            'IRR 0 surcharge' => [5.345, 'IRR', 0, 5],
143
            'IRR 12% surcharge' => [5.345, 'IRR', 12, 6],
144
            'USD 0 surcharge' => [5.345, 'USD', 0, 5.34],
145
            'USD 1% surcharge' => [5.345, 'USD', 1, 5.4],
146
        ];
147
    }
148
 
149
    /**
150
     * Provider for test_get_cost_as_string
151
     *
152
     * @return array[]
153
     */
154
    public function get_cost_as_string_provider(): array {
155
        return [
156
            'IRR 0 surcharge' => [5.345, 'IRR', 0, 'IRR'."\xc2\xa0".'5'],
157
            'IRR 12% surcharge' => [5.345, 'IRR', 12, 'IRR'."\xc2\xa0".'6'],
158
            'USD 0 surcharge' => [5.345, 'USD', 0, 'USD'."\xc2\xa0".'5.34'],
159
            'USD 1% surcharge' => [5.345, 'USD', 1, 'USD'."\xc2\xa0".'5.40'],
160
        ];
161
    }
162
 
163
    /**
164
     * Test for test_format_cost function
165
     *
166
     * @dataProvider get_rounded_cost_provider
167
     * @param float $amount
168
     * @param string $currency
169
     * @param float $surcharge
170
     * @param string $expected
171
     */
11 efrain 172
    public function test_get_rounded_cost(float $amount, string $currency, float $surcharge, float $expected): void {
1 efrain 173
        $this->assertEquals($expected, helper::get_rounded_cost($amount, $currency, $surcharge));
174
    }
175
 
176
    /**
177
     * Test for get_cost_as_string function
178
     *
179
     * @dataProvider get_cost_as_string_provider
180
     * @param float $amount
181
     * @param string $currency
182
     * @param float $surcharge
183
     * @param string $expected
184
     */
11 efrain 185
    public function test_get_cost_as_string(float $amount, string $currency, float $surcharge, string $expected): void {
1 efrain 186
        // Some old ICU versions have a bug, where they don't follow the CLDR and they are
187
        // missing the non-breaking-space between the currency abbreviation and the value.
188
        // i.e. it returns AUD50 instead of AU\xc2\xa050). See the following issues @ ICU:
189
        // - https://unicode-org.atlassian.net/browse/ICU-6560
190
        // - https://unicode-org.atlassian.net/browse/ICU-8853
191
        // - https://unicode-org.atlassian.net/browse/ICU-8840
192
        // It has been detected that versions prior to ICU-61.1 / ICU-62.1 come with this
193
        // problem. Noticeably some CI images (as of December 2021) use buggy ICU-60.1.
194
        // So, here, we are going to dynamically verify the behaviour and skip the
195
        // test when buggy one is found. No need to apply this to code as dar as the real
196
        // formatting is not critical for the functionality (just small glitch).
197
        if ('IRR5' === (new \NumberFormatter('en-AU', \NumberFormatter::CURRENCY))->formatCurrency(5, 'IRR')) {
198
            $this->markTestSkipped('Old ICU libraries behavior (ICU < 62), skipping this tests');
199
        }
200
        $this->assertEquals($expected, helper::get_cost_as_string($amount, $currency, $surcharge));
201
    }
202
}