Projet

Général

Profil

0002-lingo-remove-user-retrieval-from-email-in-basket-api.patch

Valentin Deniaud, 10 juin 2020 15:24

Télécharger (22,7 ko)

Voir les différences:

Subject: [PATCH 2/3] lingo: remove user retrieval from email in basket api
 (#42992)

 combo/apps/lingo/views.py   |   4 --
 tests/test_lingo_payment.py | 125 ++++++++++++++++++------------------
 2 files changed, 64 insertions(+), 65 deletions(-)
combo/apps/lingo/views.py
180 180
        try:
181 181
            if request.GET.get('NameId'):
182 182
                user = get_user_from_name_id(request.GET.get('NameId'), raise_on_missing=True)
183
            elif request.GET.get('email'):
184
                user = User.objects.get(email=request.GET.get('email'))
185 183
            else:
186 184
                user = None
187 185
                item.email = request_body.get('email_address') or ''
......
272 270
                user = get_user_from_name_id(request.GET.get('NameId'), raise_on_missing=True)
273 271
                if user is None:
274 272
                    raise User.DoesNotExist()
275
            elif request.GET.get('email'):
276
                user = User.objects.get(email=request.GET.get('email'))
277 273
            else:
278 274
                return BadRequestJsonResponse('no user specified')
279 275
        except User.DoesNotExist:
tests/test_lingo_payment.py
6 6
from decimal import Decimal
7 7
import json
8 8
import mock
9
import uuid
10

  
11
from mellon.models import UserSAMLIdentifier
9 12

  
10 13
from django.apps import apps
11 14
from django.contrib.auth.models import User
......
106 109
                email='foo@example.com')
107 110
    return user
108 111

  
112
@pytest.fixture
113
def user_name_id(user):
114
    name_id = '7d6a86ae70f746f4887f22bad212f836'
115
    UserSAMLIdentifier.objects.create(user=user, name_id=name_id)
116
    return name_id
117

  
109 118
@pytest.fixture(params=['orig', 'sign_key'])
110 119
def key(request, settings):
111 120
    if request.param == 'orig':
......
245 254
        '/test_basket_cell/'
246 255

  
247 256

  
248
def test_add_amount_to_basket(app, key, regie, user):
257
def test_add_amount_to_basket(app, key, regie, user_name_id):
249 258
    payment_backend = PaymentBackend.objects.create(
250 259
            label='test2', slug='test2', service='dummy', service_options={'siret': '1234'})
251 260
    other_regie = Regie(label='test2', slug='test2', payment_backend=payment_backend)
252 261
    other_regie.save()
253 262

  
254
    user_email = 'foo@example.com'
255
    User.objects.get_or_create(email=user_email)
256

  
257 263
    data = {'display_name': 'test amount',
258 264
            'url': 'http://example.com'}
259
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
265
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
260 266
    url = sign_url(url, key)
261 267
    resp = app.post_json(url, params=data, status=400)
262 268
    assert 'missing amount parameter' in resp.text
263 269

  
264 270
    amount = 42
265 271
    data['amount'] = amount
266
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), 'unknown@example.com')
272
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), 'unknown_id')
267 273
    url = sign_url(url, key)
268 274
    resp = app.post_json(url, params=data, status=400)
269 275
    assert 'unknown user' in resp.text
270 276

  
271
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
277
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
272 278
    url = sign_url(url, key)
273 279
    resp = app.post_json(url, params=data)
274 280
    assert resp.status_code == 200
......
279 285
    resp = app.post_json('%s&amount=10' % url, params=data, status=403)  # bad signature
280 286

  
281 287
    data['extra'] = {'amount': '22.22'}
282
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
288
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
283 289
    url = sign_url(url, key)
284 290
    resp = app.post_json(url, params=data)
285 291
    assert resp.status_code == 200
......
288 294

  
289 295
    data['amount'] = [amount]
290 296
    data['extra'] = {'amount': ['22.22', '12']}
291
    url = '%s?email=%s&orig=wcs&amount=5' % (reverse('api-add-basket-item'), user_email)
297
    url = '%s?NameId=%s&orig=wcs&amount=5' % (reverse('api-add-basket-item'), user_name_id)
292 298
    url = sign_url(url, key)
293 299
    resp = app.post_json(url, params=data)
294 300
    assert resp.status_code == 200
......
296 302
    assert BasketItem.objects.filter(amount=Decimal('81.22')).exists()
297 303

  
298 304
    # accept french notation if settings.LANGUAGE_CODE is 'fr-*'
299
    url = '%s?amount=10,00&email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
305
    url = '%s?amount=10,00&NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
300 306
    url = sign_url(url, key)
301 307
    resp = app.post_json(url, params=data, status=400)
302 308
    assert resp.json['err_desc'] == 'invalid value for "amount" in query string'
303 309
    data['amount'] = '1,10'
304
    url = '%s?amount=10.00&email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
310
    url = '%s?amount=10.00&NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
305 311
    url = sign_url(url, key)
306 312
    resp = app.post_json(url, params=data, status=400)
307 313
    assert resp.json['err_desc'] == 'invalid value for "amount" in payload'
......
312 318

  
313 319
    data['amount'] = '1,10'
314 320
    data['extra'] = {'amount': '0,01'}
315
    url = '%s?amount=10,00&email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
321
    url = '%s?amount=10,00&NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
316 322
    url = sign_url(url, key)
317 323
    with override_settings(LANGUAGE_CODE='fr-be'):
318 324
        resp = app.post_json(url, params=data, status=200)
......
324 330
    other_regie.save()
325 331
    data['amount'] = []
326 332
    data['extra'] = {'amount': '22.23'}
327
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
333
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
328 334
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
329 335
    resp = app.post_json(url, params=data)
330 336
    item = BasketItem.objects.get(amount=Decimal('22.23'))
......
337 343
    assert BasketItem.objects.filter(amount=Decimal('22.23')).exists()
338 344
    assert BasketItem.objects.filter(amount=Decimal('22.23'))[0].regie_id == other_regie.id
339 345

  
340
    url = '%s?email=%s&regie_id=%s' % (
341
            reverse('api-add-basket-item'), user_email, regie.id)
346
    url = '%s?NameId=%s&regie_id=%s' % (
347
            reverse('api-add-basket-item'), user_name_id, regie.id)
342 348
    data['extra'] = {'amount': '22.24', 'foo': 'bar'}
343 349
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
344 350
    resp = app.post_json(url, params=data)
......
348 354
    assert BasketItem.objects.filter(amount=Decimal('22.24'))[0].regie_id == regie.id
349 355
    assert BasketItem.objects.filter(amount=Decimal('22.24'))[0].request_data == data['extra']
350 356

  
351
    url = '%s?email=%s&regie_id=%s' % (
352
        reverse('api-add-basket-item'), user_email, regie.slug)
357
    url = '%s?NameId=%s&regie_id=%s' % (
358
        reverse('api-add-basket-item'), user_name_id, regie.slug)
353 359
    data['extra'] = {'amount': '13.67'}
354 360
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
355 361
    resp = app.post_json(url, params=data)
......
358 364
    assert BasketItem.objects.filter(amount=Decimal('13.67')).exists()
359 365
    assert BasketItem.objects.filter(amount=Decimal('13.67'))[0].regie_id == regie.id
360 366

  
361
    url = '%s?email=%s&orig=wcs&regie_id=%s' % (reverse('api-add-basket-item'), user_email, 'scarecrow')
367
    url = '%s?NameId=%s&orig=wcs&regie_id=%s' % (reverse('api-add-basket-item'), user_name_id, 'scarecrow')
362 368
    url = sign_url(url, key)
363 369
    resp = app.post_json(url, params=data, status=400)
364 370
    assert resp.json['err_desc'] == 'unknown regie'
365 371

  
366 372

  
367
def test_basket_item_with_capture_date(app, user, regie, basket_page, monkeypatch):
368
    User.objects.get_or_create(email=user.email)
369
    url = '%s?email=%s' % (reverse('api-add-basket-item'), user.email)
373
def test_basket_item_with_capture_date(app, user, user_name_id, regie, basket_page, monkeypatch):
374
    url = '%s?NameId=%s' % (reverse('api-add-basket-item'), user_name_id)
370 375
    capture_date = timezone.now().date()
371 376
    data = {
372 377
        'amount': 10, 'capture_date': capture_date.isoformat(),
......
393 398

  
394 399

  
395 400
@pytest.mark.parametrize("invalid_capture_date", [8, '', 'not-a-date'])
396
def test_add_basket_capture_date_format(app, user, regie, invalid_capture_date):
397
    url = '%s?email=%s' % (reverse('api-add-basket-item'), user.email)
401
def test_add_basket_capture_date_format(app, user_name_id, regie, invalid_capture_date):
402
    url = '%s?NameId=%s' % (reverse('api-add-basket-item'), user_name_id)
398 403
    data = {'amount': 10, 'display_name': 'test item'}
399 404
    data['capture_date'] = invalid_capture_date
400 405
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
......
402 407
    assert resp.json['err_desc'] == 'bad format for capture date, it should be yyyy-mm-dd'
403 408

  
404 409

  
405
def test_add_basket_item_with_remote_regie(app, user, remote_regie):
410
def test_add_basket_item_with_remote_regie(app, user_name_id, remote_regie):
406 411
    data = {'amount': 10, 'display_name': 'test item'}
407
    url = '%s?email=%s' % (reverse('api-add-basket-item'), user.email)
412
    url = '%s?NameId=%s' % (reverse('api-add-basket-item'), user_name_id)
408 413
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
409 414
    resp = app.post_json(url, params=data, status=400)
410 415
    assert resp.json['err_desc'] == 'can not add a basket item to a remote regie'
411 416

  
412 417

  
413
def test_add_basket_item_without_display_name(app, user, regie):
418
def test_add_basket_item_without_display_name(app, user_name_id, regie):
414 419
    data = {'amount': '42',
415 420
            'url': 'http://example.com'}
416
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user.email)
421
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
417 422
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
418 423
    resp = app.post_json(url, params=data, status=400)
419 424
    assert 'missing display_name parameter' in resp.text
......
445 450
    assert "Invalid grouping for basket items: different capture dates." in resp.text
446 451

  
447 452

  
448
def test_pay_single_basket_item(app, key, regie, user, john_doe):
453
def test_pay_single_basket_item(app, key, regie, user_name_id, john_doe):
449 454
    page = Page(title='xxx', slug='index', template_name='standard')
450 455
    page.save()
451 456
    cell = LingoBasketCell(page=page, placeholder='content', order=0)
......
455 460
    data = {'amount': amount,
456 461
            'display_name': 'test amount',
457 462
            'url': 'http://example.com'}
458
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user.email)
463
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
459 464
    url = sign_url(url, key)
460 465
    resp = app.post_json(url, params=data)
461 466
    # check that an unpaid item exists in basket
......
497 502
    assert_payment_status(resp.location, transaction_id=item.transaction_set.last().pk)
498 503

  
499 504

  
500
def test_pay_multiple_regies(app, key, regie, user):
501
    test_add_amount_to_basket(app, key, regie, user)
505
def test_pay_multiple_regies(app, key, regie, user_name_id):
506
    test_add_amount_to_basket(app, key, regie, user_name_id)
502 507

  
503 508
    page = Page(title='xxx', slug='test_basket_cell', template_name='standard')
504 509
    page.save()
......
516 521
    qs = urlparse.parse_qs(urlparse.urlparse(resp.location).query)
517 522
    assert qs['amount'] == ['22.23']
518 523

  
519
def test_pay_as_anonymous_user(app, key, regie, user):
520
    test_add_amount_to_basket(app, key, regie, user)
524
def test_pay_as_anonymous_user(app, key, regie, user_name_id):
525
    test_add_amount_to_basket(app, key, regie, user_name_id)
521 526

  
522 527
    page = Page(title='xxx', slug='test_basket_cell', template_name='standard')
523 528
    page.save()
......
529 534
    resp = resp.forms[0].submit().follow()
530 535
    assert 'Payment requires to be logged in.' in resp.text
531 536

  
532
def test_cancel_basket_item(app, key, regie, user):
533
    user_email = 'foo@example.com'
534
    User.objects.get_or_create(email=user_email)
535
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
537
def test_cancel_basket_item(app, key, regie, user_name_id):
538
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
536 539
    url = sign_url(url, key)
537 540
    data = {'amount': 42, 'display_name': 'test amount', 'url':
538 541
            'http://example.com/', 'notify': 'true'}
......
550 553
    assert BasketItem.objects.filter(amount=21, cancellation_date__isnull=True).exists()
551 554
    basket_item_id_2 = json.loads(resp.text)['id']
552 555

  
553
    url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_email)
556
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_name_id)
554 557
    url = sign_url(url, key)
555 558
    data = {'notify': 'true'}
556 559
    resp = app.post_json(url, params=data, status=400)
557 560
    assert resp.json['err_desc'] == 'missing basket_item_id parameter'
558 561

  
559
    url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_email)
562
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_name_id)
560 563
    url = sign_url(url, key)
561 564
    data = {'basket_item_id': 'eggs', 'notify': 'true'}
562 565
    resp = app.post_json(url, params=data, status=400)
563 566
    assert resp.json['err_desc'] == 'invalid basket_item_id'
564 567

  
565
    url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_email)
568
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_name_id)
566 569
    url = sign_url(url, key)
567 570
    data = {'basket_item_id': 0, 'notify': 'true'}
568 571
    resp = app.post_json(url, params=data, status=400)
......
574 577
    resp = app.post_json(url, params=data, status=400)
575 578
    assert resp.json['err_desc'] == 'no user specified'
576 579

  
577
    url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), 'unknown@example.com')
580
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), 'unknown@example.com')
578 581
    url = sign_url(url, key)
579 582
    data = {'basket_item_id': basket_item_id, 'notify': 'true'}
580 583
    resp = app.post_json(url, params=data, status=400)
581 584
    assert resp.json['err_desc'] == 'unknown user'
582 585

  
583
    other_user_email = 'bar@example.net'
584
    User.objects.get_or_create(email=other_user_email)
585
    url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), other_user_email)
586
    other_user, _ = User.objects.get_or_create(email='hop@example.com')
587
    other_user_name_id = uuid.uuid4()
588
    UserSAMLIdentifier.objects.get_or_create(user=other_user, name_id=other_user_name_id)
589
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), other_user_name_id)
586 590
    url = sign_url(url, key)
587 591
    data = {'basket_item_id': basket_item_id, 'notify': 'true'}
588 592
    resp = app.post_json(url, params=data, status=400)
589 593
    assert resp.json['err_desc'] == 'user does not own the basket item'
590 594

  
591 595
    with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as request:
592
        url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_email)
596
        url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_name_id)
593 597
        url = sign_url(url, key)
594 598
        data = {'basket_item_id': basket_item_id, 'notify': 'true'}
595 599
        resp = app.post_json(url, params=data)
......
598 602
        assert BasketItem.objects.filter(amount=21, cancellation_date__isnull=True).exists()
599 603

  
600 604
    with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as request:
601
        url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_email)
605
        url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_name_id)
602 606
        url = sign_url(url, key)
603 607
        data = {'basket_item_id': basket_item_id_2}
604 608
        resp = app.post_json(url, params=data)
......
606 610
        assert not BasketItem.objects.filter(amount=42, cancellation_date__isnull=True).exists()
607 611
        assert not BasketItem.objects.filter(amount=21, cancellation_date__isnull=True).exists()
608 612

  
609
    url = '%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_email)
613
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_name_id)
610 614
    url = sign_url(url, key)
611 615
    data = {'basket_item_id': basket_item_id}
612 616
    resp = app.post_json(url, params=data, status=400)
613 617
    assert resp.json['err_desc'] == 'basket item already cancelled'
614 618

  
615 619

  
616
def test_cancel_basket_item_from_cell(app, key, regie, user):
620
def test_cancel_basket_item_from_cell(app, key, regie, user_name_id):
617 621
    page = Page(title='xxx', slug='test_basket_cell', template_name='standard')
618 622
    page.save()
619 623
    cell = LingoBasketCell(page=page, placeholder='content', order=0)
620 624
    cell.save()
621 625

  
622
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user.email)
626
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
623 627
    url = sign_url(url, key)
624 628
    data = {'amount': 42, 'display_name': 'test amount', 'url': 'http://example.org/testitem/'}
625 629
    resp = app.post_json(url, params=data)
......
642 646
    assert BasketItem.objects.filter(id=basket_item_id, cancellation_date__isnull=False).exists()
643 647

  
644 648
    # check removal of an item that is not cancellable
645
    url = '%s?email=%s&cancellable=no&orig=wcs' % (reverse('api-add-basket-item'), user.email)
649
    url = '%s?NameId=%s&cancellable=no&orig=wcs' % (reverse('api-add-basket-item'), user_name_id)
646 650
    url = sign_url(url, key)
647 651
    data = {'amount': 21, 'display_name': 'test amount',
648 652
            'url': 'http://example.org/testitem/'}
......
658 662
    assert 'This item cannot be removed.' in resp.text
659 663

  
660 664
    # check removal of the item of another user
661
    user_email = 'bar@example.com'
662
    User.objects.get_or_create(email=user_email)
663
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
665
    other_user, _ = User.objects.get_or_create(email='hop@example.com')
666
    other_user_name_id = uuid.uuid4()
667
    UserSAMLIdentifier.objects.get_or_create(user=other_user, name_id=other_user_name_id)
668
    url = '%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), other_user_name_id)
664 669
    url = sign_url(url, key)
665 670
    data = {'amount': 42, 'display_name': 'test amount', 'url': 'http://example.org/testitem/'}
666 671
    resp = app.post_json(url, params=data)
......
941 946
        assert json.loads(resp.text)['err'] == 1
942 947
        assert TransactionOperation.objects.filter(transaction=t1).count() == 1
943 948

  
944
def test_extra_fees(app, basket_page, key, regie, user):
949
def test_extra_fees(app, basket_page, key, regie, user_name_id):
945 950
    regie.extra_fees_ws_url = 'http://www.example.net/extra-fees'
946 951
    regie.save()
947 952

  
948
    user_email = 'foo@example.com'
949
    User.objects.get_or_create(email=user_email)
950 953
    amount = 42
951 954
    data = {'amount': amount, 'display_name': 'test amount'}
952 955
    with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as request:
......
954 957
        mock_json.status_code = 200
955 958
        mock_json.json.return_value = {'err': 0, 'data': [{'subject': 'Extra Fees', 'amount': '5'}]}
956 959
        request.return_value = mock_json
957
        url = sign_url('%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email), key)
960
        url = sign_url('%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id), key)
958 961
        resp = app.post_json(url, params=data)
959 962
    assert resp.status_code == 200
960 963
    assert json.loads(resp.text)['result'] == 'success'
......
969 972
        mock_json.json.return_value = {'err': 0, 'data': [{'subject': 'Extra Fees', 'amount': '7'}]}
970 973
        request.return_value = mock_json
971 974
        data['amount'] = 43
972
        url = sign_url('%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email), key)
975
        url = sign_url('%s?NameId=%s&orig=wcs' % (reverse('api-add-basket-item'), user_name_id), key)
973 976
        resp = app.post_json(url, params=data)
974 977
        assert request.call_args[0] == ('POST', 'http://www.example.net/extra-fees')
975 978
        assert len(json.loads(request.call_args[1]['data'])['data']) == 2
......
984 987
        mock_json.status_code = 200
985 988
        mock_json.json.return_value = {'err': 0, 'data': [{'subject': 'Extra Fees', 'amount': '4'}]}
986 989
        request.return_value = mock_json
987
        url = sign_url('%s?email=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_email), key)
990
        url = sign_url('%s?NameId=%s&orig=wcs' % (reverse('api-remove-basket-item'), user_name_id), key)
988 991
        data = {'basket_item_id': BasketItem.objects.get(amount=43).id}
989 992
        resp = app.post_json(url, params=data)
990 993
    assert resp.status_code == 200
......
1101 1104

  
1102 1105

  
1103 1106
@pytest.mark.parametrize("authenticated", [True, False])
1104
def test_payment_no_basket(app, user, regie, authenticated):
1107
def test_payment_no_basket(app, user_name_id, regie, authenticated):
1105 1108
    url = reverse('api-add-basket-item')
1106 1109
    source_url = 'http://example.org/item/1'
1107 1110
    data = {'amount': 10, 'display_name': 'test item', 'url': source_url}
1108 1111
    if authenticated:
1109
        data['email'] = user.email
1112
        data['NameId'] = user_name_id
1110 1113
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
1111 1114
    resp = app.post_json(url, params=data)
1112 1115
    assert resp.status_code == 200
1113
-