View | Details | Raw Unified | Return to bug 30979
Collapse All | Expand All

(-)a/installer/data/mysql/atomicupdate/bug_30979.pl (-2 / +2 lines)
Lines 9-16 return { Link Here
9
        $dbh->do(
9
        $dbh->do(
10
            q{
10
            q{
11
                INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
11
                INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
12
	            ('OpacTrustedCheckout', '0', NULL, 'Allow logged in OPAC users to check out to themselves', 'YesNo')
12
                ('OpacTrustedCheckout', '0', NULL, 'Allow logged in OPAC users to check out to themselves', 'YesNo')
13
	        }
13
            }
14
        );
14
        );
15
    },
15
    },
16
};
16
};
(-)a/t/db_dependent/api/v1/checkouts.t (-111 / +63 lines)
Lines 264-271 subtest 'get_availability' => sub { Link Here
264
        }
264
        }
265
    );
265
    );
266
    my $unauth_password = 'thePassword000';
266
    my $unauth_password = 'thePassword000';
267
    $patron->set_password(
267
    $patron->set_password( { password => $unauth_password, skip_validattion => 1 } );
268
        { password => $unauth_password, skip_validattion => 1 } );
269
    my $unauth_userid = $patron->userid;
268
    my $unauth_userid = $patron->userid;
270
    my $patron_id     = $patron->borrowernumber;
269
    my $patron_id     = $patron->borrowernumber;
271
270
Lines 278-284 subtest 'get_availability' => sub { Link Here
278
    my %needsconfirmation = ();
277
    my %needsconfirmation = ();
279
    my %alerts            = ();
278
    my %alerts            = ();
280
    my %messages          = ();
279
    my %messages          = ();
281
    my $mocked_circ = Test::MockModule->new('C4::Circulation');
280
    my $mocked_circ       = Test::MockModule->new('C4::Circulation');
282
    $mocked_circ->mock(
281
    $mocked_circ->mock(
283
        'CanBookBeIssued',
282
        'CanBookBeIssued',
284
        sub {
283
        sub {
Lines 287-346 subtest 'get_availability' => sub { Link Here
287
    );
286
    );
288
287
289
    $t->get_ok(
288
    $t->get_ok(
290
"//$unauth_userid:$unauth_password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
289
        "//$unauth_userid:$unauth_password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
291
    )->status_is(403)->json_is(
290
        ->status_is(403)->json_is(
292
        {
291
        {
293
            error => "Authorization failure. Missing required permission(s).",
292
            error                => "Authorization failure. Missing required permission(s).",
294
            required_permissions =>
293
            required_permissions => { circulate => "circulate_remaining_permissions" }
295
              { circulate => "circulate_remaining_permissions" }
296
        }
294
        }
297
    );
295
        );
298
296
299
    # Available
297
    # Available
300
    $t->get_ok(
298
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
301
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
299
        ->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
302
    )->status_is(200)->json_is( '/blockers' => {} )
300
        ->json_has('/confirmation_token');
303
      ->json_is( '/confirms'           => {} )->json_is( '/warnings' => {} )
304
      ->json_has( '/confirmation_token');
305
301
306
    # Blocked
302
    # Blocked
307
    %issuingimpossible = ( GNA => 1 );
303
    %issuingimpossible = ( GNA => 1 );
308
    $t->get_ok(
304
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
309
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
305
        ->status_is(200)->json_is( '/blockers' => { GNA => 1 } )->json_is( '/confirms' => {} )
310
    )->status_is(200)->json_is( '/blockers' => { GNA => 1 } )
306
        ->json_is( '/warnings' => {} )->json_has('/confirmation_token');
311
      ->json_is( '/confirms'           => {} )->json_is( '/warnings' => {} )
312
      ->json_has( '/confirmation_token');
313
    %issuingimpossible = ();
307
    %issuingimpossible = ();
314
308
315
    # Warnings/Info
309
    # Warnings/Info
316
    %alerts   = ( alert1   => "this is an alert" );
310
    %alerts   = ( alert1   => "this is an alert" );
317
    %messages = ( message1 => "this is a message" );
311
    %messages = ( message1 => "this is a message" );
318
    $t->get_ok(
312
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
319
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
313
        ->status_is(200)->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )
320
    )->status_is(200)->json_is( '/blockers' => {} )
314
        ->json_is( '/warnings' => { alert1 => "this is an alert", message1 => "this is a message" } )
321
      ->json_is( '/confirms' => {} )
315
        ->json_has('/confirmation_token');
322
      ->json_is( '/warnings' =>
323
          { alert1 => "this is an alert", message1 => "this is a message" } )
324
      ->json_has( '/confirmation_token');
325
    %alerts   = ();
316
    %alerts   = ();
326
    %messages = ();
317
    %messages = ();
327
318
328
    # Needs confirm
319
    # Needs confirm
329
    %needsconfirmation = ( confirm1 => 1, confirm2 => 'please' );
320
    %needsconfirmation = ( confirm1 => 1, confirm2 => 'please' );
330
    my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" });
321
    my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" } );
331
    $t->get_ok(
322
    $t->get_ok("//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")
332
"//$userid:$password@/api/v1/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
323
        ->status_is(200)->json_is( '/blockers' => {} )
333
    )->status_is(200)->json_is( '/blockers' => {} )
324
        ->json_is( '/confirms' => { confirm1 => 1, confirm2 => 'please' } )->json_is( '/warnings' => {} )
334
      ->json_is( '/confirms' => { confirm1 => 1, confirm2 => 'please' } )
325
        ->json_has('/confirmation_token');
335
      ->json_is( '/warnings' => {} )
336
      ->json_has( '/confirmation_token');
337
    my $confirmation_token = $t->tx->res->json('/confirmation_token');
326
    my $confirmation_token = $t->tx->res->json('/confirmation_token');
338
    ok(
327
    ok(
339
        Koha::Token->new->check_jwt(
328
        Koha::Token->new->check_jwt(
340
            {
329
            {
341
                id => $librarian->id . ":"
330
                id    => $librarian->id . ":" . $item1_id . ":confirm1:confirm2",
342
                  . $item1_id
343
                  . ":confirm1:confirm2",
344
                token => $confirmation_token
331
                token => $confirmation_token
345
            }
332
            }
346
        ),
333
        ),
Lines 352-371 subtest 'get_availability' => sub { Link Here
352
        plan tests => 18;
339
        plan tests => 18;
353
340
354
        # Available, Not authentication required
341
        # Available, Not authentication required
355
        $t->get_ok(
342
        $t->get_ok("/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")->status_is(200)
356
"/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
343
            ->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
357
        )->status_is(200)->json_is( '/blockers' => {} )
344
            ->json_has('/confirmation_token');
358
          ->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
359
          ->json_has('/confirmation_token');
360
345
361
        # Needs confirmation upgrade to blocker
346
        # Needs confirmation upgrade to blocker
362
        %needsconfirmation = ( TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 );
347
        %needsconfirmation = ( TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 );
363
        $t->get_ok(
348
        $t->get_ok("/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")->status_is(200)
364
"/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
349
            ->json_is( '/blockers' => { TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 } )->json_is( '/confirms' => {} )
365
        )->status_is(200)
350
            ->json_is( '/warnings' => {} )->json_has('/confirmation_token');
366
          ->json_is( '/blockers' => { TOO_MANY => 1, ISSUED_TO_ANOTHER => 1 } )
367
          ->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
368
          ->json_has('/confirmation_token');
369
        %needsconfirmation = ();
351
        %needsconfirmation = ();
370
352
371
        # Remove personal information from public endpoint
353
        # Remove personal information from public endpoint
Lines 412-422 subtest 'get_availability' => sub { Link Here
412
            ressurname            => 'private',
394
            ressurname            => 'private',
413
            item_notforloan       => 'private'
395
            item_notforloan       => 'private'
414
        );
396
        );
415
        $t->get_ok(
397
        $t->get_ok("/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id")->status_is(200)
416
"/api/v1/public/checkouts/availability?item_id=$item1_id&patron_id=$patron_id"
398
            ->json_is( '/blockers' => {} )->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
417
        )->status_is(200)->json_is( '/blockers' => {} )
399
            ->json_has('/confirmation_token');
418
          ->json_is( '/confirms' => {} )->json_is( '/warnings' => {} )
419
          ->json_has('/confirmation_token');
420
        %issuingimpossible = ();
400
        %issuingimpossible = ();
421
        %alerts            = ();
401
        %alerts            = ();
422
        %needsconfirmation = ();
402
        %needsconfirmation = ();
Lines 447-454 subtest 'add checkout' => sub { Link Here
447
        }
427
        }
448
    );
428
    );
449
    my $unauth_password = 'thePassword000';
429
    my $unauth_password = 'thePassword000';
450
    $patron->set_password(
430
    $patron->set_password( { password => $unauth_password, skip_validattion => 1 } );
451
        { password => $unauth_password, skip_validattion => 1 } );
452
    my $unauth_userid = $patron->userid;
431
    my $unauth_userid = $patron->userid;
453
    my $patron_id     = $patron->borrowernumber;
432
    my $patron_id     = $patron->borrowernumber;
454
433
Lines 461-467 subtest 'add checkout' => sub { Link Here
461
    my %needsconfirmation = ();
440
    my %needsconfirmation = ();
462
    my %alerts            = ();
441
    my %alerts            = ();
463
    my %messages          = ();
442
    my %messages          = ();
464
    my $mocked_circ = Test::MockModule->new('C4::Circulation');
443
    my $mocked_circ       = Test::MockModule->new('C4::Circulation');
465
    $mocked_circ->mock(
444
    $mocked_circ->mock(
466
        'CanBookBeIssued',
445
        'CanBookBeIssued',
467
        sub {
446
        sub {
Lines 469-563 subtest 'add checkout' => sub { Link Here
469
        }
448
        }
470
    );
449
    );
471
450
472
    $t->post_ok(
451
    $t->post_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts" => json =>
473
        "//$unauth_userid:$unauth_password@/api/v1/checkouts" => json =>
452
            { item_id => $item1_id, patron_id => $patron_id } )->status_is(403)->json_is(
474
          { item_id => $item1_id, patron_id => $patron_id } )->status_is(403)
475
      ->json_is(
476
        {
453
        {
477
            error => "Authorization failure. Missing required permission(s).",
454
            error                => "Authorization failure. Missing required permission(s).",
478
            required_permissions =>
455
            required_permissions => { circulate => "circulate_remaining_permissions" }
479
              { circulate => "circulate_remaining_permissions" }
480
        }
456
        }
481
      );
457
            );
482
458
483
    $t->post_ok( "//$userid:$password@/api/v1/checkouts" => json =>
459
    $t->post_ok( "//$userid:$password@/api/v1/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } )
484
          { item_id => $item1_id, patron_id => $patron_id } )->status_is(201);
460
        ->status_is(201);
485
461
486
    # Needs confirm
462
    # Needs confirm
487
    %needsconfirmation = ( confirm1 => 1, confirm2 => 'please' );
463
    %needsconfirmation = ( confirm1 => 1, confirm2 => 'please' );
488
    $t->post_ok(
464
    $t->post_ok(
489
        "//$userid:$password@/api/v1/checkouts" => json => {
465
        "//$userid:$password@/api/v1/checkouts" => json => {
490
            item_id            => $item1_id,
466
            item_id   => $item1_id,
491
            patron_id          => $patron_id,
467
            patron_id => $patron_id,
492
        }
468
        }
493
    )->status_is(412);
469
    )->status_is(412);
494
470
495
    my $token = Koha::Token->new->generate_jwt(
471
    my $token = Koha::Token->new->generate_jwt( { id => $librarian->id . ":" . $item1_id . ":confirm1:confirm2" } );
496
        {
497
                id => $librarian->id . ":"
498
              . $item1_id
499
              . ":confirm1:confirm2"
500
        }
501
    );
502
    $t->post_ok(
472
    $t->post_ok(
503
        "//$userid:$password@/api/v1/checkouts?confirmation=$token" => json => {
473
        "//$userid:$password@/api/v1/checkouts?confirmation=$token" => json => {
504
            item_id            => $item1_id,
474
            item_id   => $item1_id,
505
            patron_id          => $patron_id
475
            patron_id => $patron_id
506
        }
476
        }
507
    )->status_is(201)->or(sub { diag $t->tx->res->body });
477
    )->status_is(201)->or( sub { diag $t->tx->res->body } );
508
    %needsconfirmation = ();
478
    %needsconfirmation = ();
509
479
510
    subtest 'public add' => sub {
480
    subtest 'public add' => sub {
511
        plan tests => 14;
481
        plan tests => 14;
512
482
513
        my $useridp = $patron->userid;
483
        my $useridp = $patron->userid;
514
        $patron->set_password(
484
        $patron->set_password( { password => $password, skip_validation => 1 } );
515
            { password => $password, skip_validation => 1 } );
516
485
517
        # Feature disabled
486
        # Feature disabled
518
        t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 0 );
487
        t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 0 );
519
488
520
        $t->post_ok( "/api/v1/public/patrons/$patron_id/checkouts" => json =>
521
              { item_id => $item1_id, patron_id => $patron_id } )
522
          ->status_is(401)->json_is(
523
            {
524
                error => "Authentication failure."
525
            }
526
          );
527
528
        $t->post_ok(
489
        $t->post_ok(
529
            "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts"
490
            "/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } )
530
              => json => { item_id => $item1_id, patron_id => $patron_id } )
491
            ->status_is(401)->json_is( { error => "Authentication failure." } );
531
          ->status_is(405)
492
532
          ->json_is(
493
        $t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
533
            { error => "Feature disabled", error_code => "FEATURE_DISABLED" } );
494
                { item_id => $item1_id, patron_id => $patron_id } )->status_is(405)
495
            ->json_is( { error => "Feature disabled", error_code => "FEATURE_DISABLED" } );
534
496
535
        # Feature enabled
497
        # Feature enabled
536
        t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 1 );
498
        t::lib::Mocks::mock_preference( 'OpacTrustedCheckout', 1 );
537
499
538
        $t->post_ok( "/api/v1/public/patrons/$patron_id/checkouts" => json =>
539
              { item_id => $item1_id, patron_id => $patron_id } )
540
          ->status_is(401)->json_is(
541
            {
542
                error => "Authentication failure."
543
            }
544
          );
545
546
        $t->post_ok(
500
        $t->post_ok(
547
            "//$userid:$password@/api/v1/public/patrons/$patron_id/checkouts"
501
            "/api/v1/public/patrons/$patron_id/checkouts" => json => { item_id => $item1_id, patron_id => $patron_id } )
548
              => json => { item_id => $item1_id, patron_id => $patron_id } )
502
            ->status_is(401)->json_is( { error => "Authentication failure." } );
549
          ->status_is(403)->json_is(
503
504
        $t->post_ok( "//$userid:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
505
                { item_id => $item1_id, patron_id => $patron_id } )->status_is(403)->json_is(
550
            {
506
            {
551
                error =>
507
                error                => "Authorization failure. Missing required permission(s).",
552
                  "Authorization failure. Missing required permission(s).",
553
                required_permissions => undef
508
                required_permissions => undef
554
            }
509
            }
555
          );
510
                );
556
511
557
        $t->post_ok(
512
        $t->post_ok( "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts" => json =>
558
            "//$useridp:$password@/api/v1/public/patrons/$patron_id/checkouts"
513
                { item_id => $item1_id, patron_id => $patron_id } )->status_is(201);
559
              => json => { item_id => $item1_id, patron_id => $patron_id } )
560
          ->status_is(201);
561
    };
514
    };
562
515
563
    $schema->storage->txn_rollback;
516
    $schema->storage->txn_rollback;
564
- 

Return to bug 30979