Passed
Push — master ( bacc5f...5eccc7 )
by Dispositif
02:22
created

OuvrageOptimizeTest::provideISBN()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 57
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 9
Bugs 0 Features 0
Metric Value
cc 1
eloc 23
nc 1
nop 0
dl 0
loc 57
rs 9.552
c 9
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * This file is part of dispositif/wikibot application
4
 * 2019 : Philippe M. <[email protected]>
5
 * For the full copyright and MIT license information, please view the LICENSE file.
6
 */
7
8
declare(strict_types=1);
9
10
namespace App\Domain\Tests;
11
12
use App\Domain\OuvrageOptimize;
13
use App\Domain\Utils\TemplateParser;
14
use App\Domain\WikiTemplateFactory;
15
use Exception;
16
use PHPUnit\Framework\TestCase;
17
18
class OuvrageOptimizeTest extends TestCase
19
{
20
    /**
21
     * @dataProvider provideSomeParam
22
     *
23
     * @param $data
24
     * @param $expected
25
     *
26
     * @throws Exception
27
     */
28
    public function testSomeParam($data, $expected)
29
    {
30
        $ouvrage = WikiTemplateFactory::create('ouvrage');
31
        $ouvrage->hydrate($data);
32
33
        $optimized = (new OuvrageOptimize($ouvrage))->doTasks()->getOuvrage();
34
        $this::assertSame(
35
            $expected,
36
            $optimized->serialize(true)
37
        );
38
    }
39
40
    public function provideSomeParam()
41
    {
42
        return [
43
            [
44
                // prédiction paramètre
45
                ['citation' => 'blabla'],
46
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=}}{{Citation bloc|blabla}}',
47
            ],
48
            [
49
                // année vide retirée si date=bla
50
                ['date' => '12-12-2018'],
51
                '{{Ouvrage|titre=|éditeur=|date=12-12-2018|pages totales=|isbn=}}',
52
            ],
53
            [
54
                // prédiction paramètre
55
                ['autuer' => 'bob'],
56
                '{{Ouvrage|auteur1=bob|titre=|éditeur=|année=|pages totales=|isbn=}}',
57
            ],
58
            [
59
                // CONVERT_GOOGLEBOOK_TEMPLATE = false;
60
                ['lire en ligne' => 'https://books.google.fr/books?id=3KNeP3Hm0TAC&pg=PA184&lpg=PA184&dq=apolline+de+Gourlet&source=bl&ots=bA3f27YKbl&sig=0EVHZ6yHKLBRTw-VgKwekQT7YZQ&hl=fr&sa=X&ved=2ahUKEwiLpNXY9pLfAhUH1hoKHa0EDy84ChDoATACegQIBRAB#v=onepage&q=apolline%20de%20Gourlet&f=false'],
61
                //'{{Ouvrage|titre=|éditeur=|année=|isbn=|lire en ligne={{Google
62
                // Livres|3KNeP3Hm0TAC|page=184|surligne=apolline+de+Gourlet}}}}'
63
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=|lire en ligne=https://books.google.fr/books?id=3KNeP3Hm0TAC&pg=PA184&dq=apolline+de+Gourlet}}',
64
            ],
65
            [
66
                [
67
                    'commentaire' => 'bla',
68
                    'plume' => 'oui',
69
                ],
70
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=|plume=oui}}{{Commentaire biblio|bla}}',
71
            ],
72
            [
73
                // langue FR : HOTFIX 22 nov 2019 "ne retire pas langue=fr" ajouté par humain
74
                ['langue' => 'Français'],
75
                '{{Ouvrage|langue=fr|titre=|éditeur=|année=|pages totales=|isbn=}}',
76
            ],
77
            [
78
                // langue FR
79
                ['langue' => 'Anglais'],
80
                '{{Ouvrage|langue=en|titre=|éditeur=|année=|pages totales=|isbn=}}',
81
            ],
82
            [
83
                // langue originale
84
                ['langue originale' => 'Anglais'],
85
                '{{Ouvrage|langue originale=en|titre=|éditeur=|année=|pages totales=|isbn=}}',
86
            ],
87
            [
88
                // 'langue originale' FR retirée si 'langue' = fr ou vide
89
                ['langue originale' => 'fr'],
90
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=}}',
91
            ],
92
            [
93
                // lien éditeur
94
                ['éditeur' => '[[Fu]]'],
95
                '{{Ouvrage|titre=|éditeur=[[Fu]]|année=|pages totales=|isbn=}}',
96
            ],
97
            [
98
                ['éditeur' => '[[Fu|Bar]] bla'],
99
                '{{Ouvrage|titre=|éditeur=[[Fu|Bar]] bla|année=|pages totales=|isbn=}}',
100
            ],
101
            [
102
                // fusion 'lien auteur', 'lien titre'
103
                ['auteur' => 'Bob', 'lien auteur' => 'Bob (artiste)', 'titre' => 'bla', 'lien titre'=>'Bla'],
104
                '{{Ouvrage|auteur1=[[Bob (artiste)|Bob]]|titre=[[Bla]]|éditeur=|année=|pages totales=|isbn=}}',
105
            ],
106
            [
107
                ['éditeur' => 'bar', 'lien éditeur' => 'fu'],
108
                '{{Ouvrage|titre=|éditeur=[[Fu|bar]]|année=|pages totales=|isbn=}}',
109
            ],
110
            [
111
                // première majuscule sans importance
112
                ['éditeur' => 'bar', 'lien éditeur' => 'Bar'],
113
                '{{Ouvrage|titre=|éditeur=[[bar]]|année=|pages totales=|isbn=}}',
114
            ],
115
            [
116
                ['éditeur' => '[[Fu]] [[Bar]]'],
117
                '{{Ouvrage|titre=|éditeur=[[Fu]] [[Bar]]|année=|pages totales=|isbn=}}',
118
            ],
119
            // Lieu
120
            [
121
                # 15
122
                ['lieu' => '[[paris]]'],
123
                '{{Ouvrage|titre=|lieu=Paris|éditeur=|année=|pages totales=|isbn=}}',
124
            ],
125
            [
126
                # lieu non traduit
127
                ['lieu' => 'London'],
128
                '{{Ouvrage|titre=|lieu=London|éditeur=|année=|pages totales=|isbn=}}',
129
            ],
130
            [
131
                # lieu traduit
132
                ['lieu' => 'London', 'langue'=> 'fr'],
133
                '{{Ouvrage|langue=fr|titre=|lieu=Londres|éditeur=|année=|pages totales=|isbn=}}',
134
            ],
135
            [
136
                ['lieu' => 'Köln'],
137
                '{{Ouvrage|titre=|lieu=Köln|éditeur=|année=|pages totales=|isbn=}}',
138
            ],
139
            [
140
                ['lieu' => 'Fu'],
141
                '{{Ouvrage|titre=|lieu=Fu|éditeur=|année=|pages totales=|isbn=}}',
142
            ],
143
            [
144
                // date
145
                ['date' => '[[1995]]'],
146
                '{{Ouvrage|titre=|éditeur=|année=1995|pages totales=|isbn=}}',
147
            ],
148
            [
149
                // bnf
150
                ['bnf' => 'FRBNF30279779'],
151
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=|bnf=30279779}}',
152
            ],
153
        ];
154
    }
155
156
    public function testGetOuvrage()
157
    {
158
        $raw
159
            = '{{Ouvrage|languX=anglais|id=ZE|prénom1=Ernest|nom1=Nègre|nom2|titre=Toponymie:France|tome=3|passage=15-27|isbn=2600028846}}';
160
161
        $parse = TemplateParser::parseAllTemplateByName('ouvrage', $raw);
162
        $origin = $parse['ouvrage'][0]['model'];
163
164
        $optimized = (new OuvrageOptimize($origin))->doTasks()->getOuvrage();
165
        $this::assertSame(
166
            '{{Ouvrage|langue=en|prénom1=Ernest|nom1=Nègre|titre=Toponymie|sous-titre=France|tome=3|éditeur=|année=|pages totales=|passage=15-27|isbn=978-2-600-02884-4|isbn2=2-600-02884-6|id=ZE}}',
167
            $optimized->serialize(true)
168
        );
169
    }
170
171
    /**
172
     * @dataProvider provideProcessTitle
173
     *
174
     * @param $data
175
     * @param $expected
176
     *
177
     * @throws Exception
178
     */
179
    public function testProcessTitle($data, $expected)
180
    {
181
        $ouvrage = WikiTemplateFactory::create('ouvrage');
182
        $ouvrage->hydrate($data);
183
184
        $optimized = (new OuvrageOptimize($ouvrage))->doTasks()->getOuvrage();
185
        $this::assertSame(
186
            $expected,
187
            $optimized->serialize(true)
188
        );
189
    }
190
191
    public function provideProcessTitle()
192
    {
193
        return [
194
//            [
195
//                // tome/volume en romain
196
//                ['tome' => '4', 'volume' => '34'],
197
//                '{{Ouvrage|titre=|volume=34|tome=4|éditeur=|année=|pages totales=|isbn=}}',
198
//            ],
199
//            [
200
//                // tome/volume bizarre
201
//                ['tome' => '4c', 'volume' => 'E'],
202
//                '{{Ouvrage|titre=|volume=E|tome=4c|éditeur=|année=|pages totales=|isbn=}}',
203
//            ],
204
            [
205
                // bug 17 nov [[titre:sous-titre]]
206
                ['title' => '[[Fu:bar]]'],
207
                '{{Ouvrage|titre=[[Fu:bar]]|éditeur=|année=|pages totales=|isbn=}}',
208
            ],
209
            [
210
                // [[titre]]
211
                ['title' => '[[Fubar]]'],
212
                '{{Ouvrage|titre=[[Fubar]]|éditeur=|année=|pages totales=|isbn=}}',
213
            ],
214
//            [
215
//                // desactivé (livre FR avec titre EN)
216
//                // {{lang}} + [[ ]]
217
//                ['title' => '{{lang|en|[[Fubar]]}}'],
218
//                '{{Ouvrage|langue=en|titre=[[Fubar]]|éditeur=|année=|pages totales=|isbn=}}',
219
//            ],
220
//            [
221
//                // desactivé (livre FR avec titre EN)
222
//                // {{lang}}
223
//                ['title' => '{{lang|en|fubar}}'],
224
//                '{{Ouvrage|langue=en|titre=Fubar|éditeur=|année=|pages totales=|isbn=}}',
225
//            ],
226
            [
227
                // lien externe -> déplacé
228
                ['title' => '[http://google.fr/bla Fubar]'],
229
                '{{Ouvrage|titre=Fubar|éditeur=|année=|pages totales=|isbn=|lire en ligne=http://google.fr/bla}}',
230
            ],
231
            [
232
                ['title' => 'Toponymie'],
233
                '{{Ouvrage|titre=Toponymie|éditeur=|année=|pages totales=|isbn=}}',
234
            ],
235
            [
236
                // Extraits des mémoires de M. le duc de Rovigo
237
                ['title' => 'Extraits des mémoires de M. le duc de Rovigo'],
238
                '{{Ouvrage|titre=Extraits des mémoires de M. le duc de Rovigo|éditeur=|année=|pages totales=|isbn=}}',
239
            ],
240
            [
241
                // inchangé (numbers)
242
                ['title' => 'Vive PHP 7.3 en short'],
243
                '{{Ouvrage|titre=Vive PHP 7.3 en short|éditeur=|année=|pages totales=|isbn=}}',
244
            ],
245
            [
246
                ['title' => 'Ils ont osé... Les maires de Saint-Camille'],
247
                '{{Ouvrage|titre=Ils ont osé... Les maires de Saint-Camille|éditeur=|année=|pages totales=|isbn=}}',
248
            ],
249
            [
250
                // explode "-" spaced)
251
                ['title' => 'Toponymie - france'],
252
                '{{Ouvrage|titre=Toponymie|sous-titre=france|éditeur=|année=|pages totales=|isbn=}}',
253
            ],
254
            [
255
                // explode "/" spaced)
256
                ['title' => 'Toponymie / France'],
257
                '{{Ouvrage|titre=Toponymie|sous-titre=France|éditeur=|année=|pages totales=|isbn=}}',
258
            ],
259
            [
260
                // inchangé
261
                ['title' => 'Toponymie Jean-Pierre France'],
262
                '{{Ouvrage|titre=Toponymie Jean-Pierre France|éditeur=|année=|pages totales=|isbn=}}',
263
            ],
264
            [
265
                // inchangé
266
                ['title' => 'Toponymie 1914-1918 super'],
267
                '{{Ouvrage|titre=Toponymie 1914-1918 super|éditeur=|année=|pages totales=|isbn=}}',
268
            ],
269
        ];
270
    }
271
272
    /**
273
     * @dataProvider provideISBN
274
     *
275
     * @param $isbn
276
     * @param $expected
277
     *
278
     * @throws Exception
279
     */
280
    public function testIsbn(array $data, $expected)
281
    {
282
        $origin = WikiTemplateFactory::create('ouvrage');
283
        $origin->hydrate($data);
284
285
        $optimized = (new OuvrageOptimize($origin))->doTasks()->getOuvrage();
286
        $this::assertSame(
287
            $expected,
288
            $optimized->serialize(true)
289
        );
290
    }
291
292
    public function provideISBN()
293
    {
294
        return [
295
            [
296
                // bug iblis/isbn Mexican ISBN
297
                ['isbn'=>'970-07-6492-3'],
298
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=978-970-07-6492-4|isbn2=970-07-6492-3}}',
299
            ],
300
            [
301
                // no ISBN before 1970
302
                ['année' => '1950'],
303
                '{{Ouvrage|titre=|éditeur=|année=1950|pages totales=}}',
304
            ],
305
            [
306
                // empty 'isbn' after 1970
307
                ['année' => '1980'],
308
                '{{Ouvrage|titre=|éditeur=|année=1980|pages totales=|isbn=}}',
309
            ],
310
            [
311
                // isbn 13
312
                ['isbn' => '9782600028844'],
313
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=978-2-600-02884-4}}',
314
            ],
315
            [
316
                // isbn10
317
                ['isbn' => '2706812516'],
318
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=978-2-7068-1251-4|isbn2=2-7068-1251-6}}',
319
            ],
320
            [
321
                // isbn10 avant 2007
322
                ['isbn' => '2706812516', 'date' => 'octobre 1988'],
323
                '{{Ouvrage|titre=|éditeur=|date=octobre 1988|pages totales=|isbn=2-7068-1251-6}}',
324
            ],
325
            [
326
                // isbn10 avant 2007
327
                ['isbn' => '2706812516', 'année' => '1988'],
328
                '{{Ouvrage|titre=|éditeur=|année=1988|pages totales=|isbn=2-7068-1251-6}}',
329
            ],
330
            [
331
                // isbn=10 et isbn2=13
332
                ['isbn' => '2706812516', 'isbn2' => '9782706812514'],
333
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=978-2-7068-1251-4|isbn2=2-7068-1251-6}}',
334
            ],
335
            [
336
                // isbn=13 et isbn2=10
337
                ['isbn' => '9782706812514', 'isbn2' => '2-706812516'],
338
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=978-2-7068-1251-4|isbn2=2-706812516}}',
339
            ],
340
            [
341
                // isbn invalide (clé vérification)
342
                ['isbn' => '978-2-600-02884-0'],
343
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=978-2-600-02884-4}}',
344
            ],
345
            [
346
                // isbn invalide
347
                ['isbn' => '978-2-600-028-0'],
348
                '{{Ouvrage|titre=|éditeur=|année=|pages totales=|isbn=978-2-600-028-0|isbn invalide=978-2-600-028-0 trop court ou trop long}}',
349
            ],
350
        ];
351
    }
352
353
    public function testDistinguishAuthors()
354
    {
355
        $ouvrage = WikiTemplateFactory::create('ouvrage');
356
        $ouvrage->hydrateFromText('{{ouvrage|auteur=Marie Durand, Pierre Berger, Francois Morgand|titre=Bla}}');
357
358
        $optimizer = (new OuvrageOptimize($ouvrage))->doTasks();
359
        $final = $optimizer->getOuvrage();
360
361
        $this::assertSame(
362
            '{{Ouvrage|auteur1=Marie Durand|auteur2=Pierre Berger|auteur3=Francois Morgand|titre=Bla|éditeur=|année=|pages totales=|isbn=}}',
363
            $final->serialize(true)
364
        );
365
    }
366
}
367