• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

iplweb / bpp / 8b645929-e463-4fa4-b2aa-ea52fecf8ad5

02 Jul 2025 09:06AM UTC coverage: 46.671% (+2.5%) from 44.2%
8b645929-e463-4fa4-b2aa-ea52fecf8ad5

push

circleci

mpasternak
Merge branch 'release/v202507.1183'

1 of 2 new or added lines in 2 files covered. (50.0%)

765 existing lines in 44 files now uncovered.

17336 of 37145 relevant lines covered (46.67%)

1.21 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
src/pbn_api/tests/test_client.py
UNCOV
1
from pathlib import Path
×
2

UNCOV
3
import pytest
×
UNCOV
4
from model_bakery import baker
×
5

UNCOV
6
from fixtures.pbn_api import MOCK_RETURNED_MONGODB_DATA
×
UNCOV
7
from pbn_api.adapters.wydawnictwo import WydawnictwoPBNAdapter
×
UNCOV
8
from pbn_api.client import (
×
9
    PBN_DELETE_PUBLICATION_STATEMENT,
10
    PBN_GET_INSTITUTION_STATEMENTS,
11
    PBN_GET_PUBLICATION_BY_ID_URL,
12
    PBN_POST_PUBLICATIONS_URL,
13
)
UNCOV
14
from pbn_api.const import PBN_GET_DISCIPLINES_URL
×
UNCOV
15
from pbn_api.exceptions import (
×
16
    HttpException,
17
    PKZeroExportDisabled,
18
    SameDataUploadedRecently,
19
)
UNCOV
20
from pbn_api.models import Institution, Publication, SentData, TlumaczDyscyplin
×
UNCOV
21
from pbn_api.models.discipline import Discipline
×
UNCOV
22
from pbn_api.tests.utils import middleware
×
23

UNCOV
24
from django.contrib.messages import get_messages
×
25

UNCOV
26
from bpp.admin.helpers.pbn_api.gui import sprobuj_wyslac_do_pbn_gui
×
UNCOV
27
from bpp.decorators import json
×
UNCOV
28
from bpp.models import Dyscyplina_Naukowa
×
29

30

UNCOV
31
@pytest.mark.django_db
×
UNCOV
32
def test_PBNClient_test_upload_publication_nie_trzeba(
×
33
    pbn_client, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina
34
):
35
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {"objectId": None}
×
36

37
    SentData.objects.updated(
×
38
        pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
39
        WydawnictwoPBNAdapter(
40
            pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina
41
        ).pbn_get_json(),
42
    )
43

44
    with pytest.raises(SameDataUploadedRecently):
×
45
        pbn_client.upload_publication(pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina)
×
46

47

UNCOV
48
class PBNTestClientException(Exception):
×
UNCOV
49
    pass
×
50

51

UNCOV
52
@pytest.mark.django_db
×
UNCOV
53
def test_PBNClient_test_upload_publication_exception(
×
54
    pbn_client, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina
55
):
56
    pbn_client.transport.return_values[
×
57
        PBN_POST_PUBLICATIONS_URL
58
    ] = PBNTestClientException("nei")
59

60
    with pytest.raises(PBNTestClientException):
×
61
        pbn_client.upload_publication(pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina)
×
62

63

UNCOV
64
@pytest.mark.django_db
×
UNCOV
65
def test_PBNClient_test_upload_publication_wszystko_ok(
×
66
    pbn_client, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina, pbn_publication
67
):
68
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
69
        "objectId": pbn_publication.pk
70
    }
71

72
    ret, js = pbn_client.upload_publication(
×
73
        pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina
74
    )
75
    assert ret["objectId"] == pbn_publication.pk
×
76

77

UNCOV
78
@pytest.mark.django_db
×
UNCOV
79
def test_sync_publication_to_samo_id(
×
80
    pbn_client,
81
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
82
    pbn_publication,
83
    pbn_autor,
84
    pbn_jednostka,
85
):
86
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid = pbn_publication
×
87
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.save()
×
88

89
    stare_id = pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
90

91
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
92
        "objectId": pbn_publication.pk
93
    }
94
    pbn_client.transport.return_values[
×
95
        PBN_GET_PUBLICATION_BY_ID_URL.format(id=pbn_publication.pk)
96
    ] = MOCK_RETURNED_MONGODB_DATA
97
    pbn_client.transport.return_values[
×
98
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
99
    ] = [
100
        {
101
            "id": "eaec3254-2eb1-44d9-8c3c-e68fc2a48bd9",
102
            "addedTimestamp": "2020.05.06",
103
            "institutionId": pbn_jednostka.pbn_uid_id,
104
            "personId": pbn_autor.pbn_uid_id,
105
            "publicationId": pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id,
106
            "area": "200",
107
            "inOrcid": True,
108
            "type": "FOOBAR",
109
        }
110
    ]
111

112
    pbn_client.sync_publication(pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina)
×
113

114
    pbn_publication.refresh_from_db()
×
115
    assert pbn_publication.versions[0]["baz"] == "quux"
×
116
    assert stare_id == pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
117

118

UNCOV
119
@pytest.mark.django_db
×
UNCOV
120
def test_sync_publication_tekstowo_podane_id(
×
121
    pbn_client, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina, pbn_publication
122
):
123
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
124
        "objectId": pbn_publication.pk
125
    }
126
    pbn_client.transport.return_values[
×
127
        PBN_GET_PUBLICATION_BY_ID_URL.format(id=pbn_publication.pk)
128
    ] = MOCK_RETURNED_MONGODB_DATA
129
    pbn_client.transport.return_values[
×
130
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
131
    ] = []
132

133
    pbn_client.sync_publication(
×
134
        f"wydawnictwo_zwarte:{pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pk}"
135
    )
136

137
    pbn_publication.refresh_from_db()
×
138
    assert pbn_publication.versions[0]["baz"] == "quux"
×
139

140

UNCOV
141
@pytest.mark.django_db
×
UNCOV
142
def test_sync_publication_nowe_id(
×
143
    pbn_client, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina, pbn_publication
144
):
145
    assert pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id is None
×
146

147
    stare_id = pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
148

149
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
150
        "objectId": pbn_publication.pk
151
    }
152
    pbn_client.transport.return_values[
×
153
        PBN_GET_PUBLICATION_BY_ID_URL.format(id=pbn_publication.pk)
154
    ] = MOCK_RETURNED_MONGODB_DATA
155
    pbn_client.transport.return_values[
×
156
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
157
    ] = []
158

159
    pbn_client.sync_publication(pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina)
×
160

161
    pbn_publication.refresh_from_db()
×
162
    assert pbn_publication.versions[0]["baz"] == "quux"
×
163
    assert stare_id != pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
164

165

UNCOV
166
@pytest.mark.django_db
×
UNCOV
167
def test_sync_publication_wysylka_z_zerowym_pk(
×
168
    pbn_client,
169
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
170
    pbn_publication,
171
    pbn_uczelnia,
172
):
173
    pbn_uczelnia.pbn_api_nie_wysylaj_prac_bez_pk = True
×
174
    pbn_uczelnia.save()
×
175

176
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.punkty_kbn = 0
×
177
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.save()
×
178

179
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
180
        "objectId": pbn_publication.pk
181
    }
182
    pbn_client.transport.return_values[
×
183
        PBN_GET_PUBLICATION_BY_ID_URL.format(id=pbn_publication.pk)
184
    ] = MOCK_RETURNED_MONGODB_DATA
185
    pbn_client.transport.return_values[
×
186
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
187
    ] = []
188

189
    # To pójdzie
190
    pbn_client.sync_publication(
×
191
        pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina, export_pk_zero=True
192
    )
193

194
    # To nie pójdzie
195
    with pytest.raises(PKZeroExportDisabled):
×
196
        pbn_client.sync_publication(
×
197
            pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina, export_pk_zero=False
198
        )
199

200

UNCOV
201
@pytest.mark.django_db
×
UNCOV
202
def test_helpers_wysylka_z_zerowym_pk(
×
203
    rf, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina, pbn_uczelnia, admin_user
204
):
205
    pbn_uczelnia.pbn_integracja = (
×
206
        pbn_uczelnia.pbn_aktualizuj_na_biezaco
207
    ) = pbn_uczelnia.pbn_api_nie_wysylaj_prac_bez_pk = True
208
    pbn_uczelnia.save()
×
209

210
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.punkty_kbn = 0
×
211
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.save()
×
212

213
    req = rf.get("/")
×
214
    req._uczelnia = pbn_uczelnia
×
215
    req.user = admin_user
×
216

217
    # I jeszcze test z poziomu admina czy parametr z pbn_uczelnia jest przekazywany
218
    with middleware(req):
×
219
        sprobuj_wyslac_do_pbn_gui(req, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina)
×
220
        msg = list(get_messages(req))
×
221

222
    assert "wyłączony w konfiguracji" in msg[0].message
×
223

224

UNCOV
225
@pytest.mark.django_db
×
UNCOV
226
def test_helpers_wysylka_z_uid_uczelni(
×
227
    rf,
228
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
229
    pbn_autor_z_dyscyplina,
230
    pbn_uczelnia,
231
    admin_user,
232
    pbn_client,
233
):
234
    odpowiednik = baker.make(Institution, mongoId="PBN_UID_UCZELNI----")
×
235

236
    baker.make(Publication, mongoId=pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pk)
×
237

238
    pbn_uczelnia.pbn_uid = odpowiednik
×
239
    pbn_uczelnia.pbn_api_afiliacja_zawsze_na_uczelnie = True
×
240
    pbn_uczelnia.save()
×
241

242
    pbn_uczelnia.pbn_integracja = pbn_uczelnia.pbn_aktualizuj_na_biezaco = True
×
243
    pbn_uczelnia.save()
×
244

245
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
246
        "objectId": pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pk
247
    }
248
    pbn_client.transport.return_values[
×
249
        PBN_GET_PUBLICATION_BY_ID_URL.format(
250
            id=pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pk
251
        )
252
    ] = MOCK_RETURNED_MONGODB_DATA
253

254
    pbn_client.transport.return_values[
×
255
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
256
    ] = []
257

258
    req = rf.get("/")
×
259
    req._uczelnia = pbn_uczelnia
×
260
    req.user = admin_user
×
261

262
    with middleware(req):
×
263
        sprobuj_wyslac_do_pbn_gui(req, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina)
×
264
        msg = list(get_messages(req))
×
265

266
    assert len(msg) == 1 and str(msg[0]).find("y zaktualizowane") > -1
×
267

268
    iv = pbn_client.transport.input_values["/api/v1/publications"]
×
269
    assert iv["body"]["authors"][0]["affiliations"][0] == odpowiednik.pk
×
270
    assert iv["body"]["institutions"][odpowiednik.pk]["objectId"] == odpowiednik.pk
×
271

272

UNCOV
273
@pytest.mark.django_db
×
UNCOV
274
def test_helpers_wysylka_bez_uid_uczelni(
×
275
    rf,
276
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
277
    pbn_autor_z_dyscyplina,
278
    pbn_uczelnia,
279
    pbn_jednostka,
280
    admin_user,
281
    pbn_client,
282
):
283
    odpowiednik = baker.make(Institution, mongoId="PBN_UID_UCZELNI----")
×
284

285
    baker.make(Publication, mongoId=pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pk)
×
286

287
    pbn_uczelnia.pbn_uid = odpowiednik
×
288
    pbn_uczelnia.pbn_api_afiliacja_zawsze_na_uczelnie = False
×
289
    pbn_uczelnia.save()
×
290

291
    pbn_uczelnia.pbn_integracja = pbn_uczelnia.pbn_aktualizuj_na_biezaco = True
×
292
    pbn_uczelnia.save()
×
293

294
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
295
        "objectId": pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pk
296
    }
297
    pbn_client.transport.return_values[
×
298
        PBN_GET_PUBLICATION_BY_ID_URL.format(
299
            id=pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pk
300
        )
301
    ] = MOCK_RETURNED_MONGODB_DATA
302

303
    pbn_client.transport.return_values[
×
304
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
305
    ] = []
306

307
    req = rf.get("/")
×
308
    req._uczelnia = pbn_uczelnia
×
309
    req.user = admin_user
×
310

311
    with middleware(req):
×
312
        sprobuj_wyslac_do_pbn_gui(req, pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina)
×
313
        msg = list(get_messages(req))
×
314

315
    assert len(msg) == 1 and str(msg[0]).find("y zaktualizowane") > -1
×
316

317
    iv = pbn_client.transport.input_values["/api/v1/publications"]
×
318
    assert iv["body"]["authors"][0]["affiliations"][0] == pbn_jednostka.pbn_uid_id
×
319
    assert (
×
320
        iv["body"]["institutions"][pbn_jednostka.pbn_uid_id]["objectId"]
321
        == pbn_jednostka.pbn_uid_id
322
    )
323

324

UNCOV
325
@pytest.mark.django_db
×
UNCOV
326
def test_sync_publication_kasuj_oswiadczenia_przed_wszystko_dobrze(
×
327
    pbn_client,
328
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
329
    pbn_publication,
330
    pbn_autor,
331
    pbn_jednostka,
332
):
333
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid = pbn_publication
×
334
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.save()
×
335

336
    stare_id = pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
337

338
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
339
        "objectId": pbn_publication.pk
340
    }
341
    pbn_client.transport.return_values[
×
342
        PBN_GET_PUBLICATION_BY_ID_URL.format(id=pbn_publication.pk)
343
    ] = MOCK_RETURNED_MONGODB_DATA
344
    pbn_client.transport.return_values[
×
345
        PBN_DELETE_PUBLICATION_STATEMENT.format(publicationId=pbn_publication.pk)
346
    ] = []
347
    pbn_client.transport.return_values[
×
348
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
349
    ] = [
350
        {
351
            "id": "eaec3254-2eb1-44d9-8c3c-e68fc2a48bd9",
352
            "addedTimestamp": "2020.05.06",
353
            "institutionId": pbn_jednostka.pbn_uid_id,
354
            "personId": pbn_autor.pbn_uid_id,
355
            "publicationId": pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id,
356
            "area": "200",
357
            "inOrcid": True,
358
            "type": "FOOBAR",
359
        }
360
    ]
361

362
    pbn_client.sync_publication(
×
363
        pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
364
        delete_statements_before_upload=True,
365
    )
366

367
    pbn_publication.refresh_from_db()
×
368
    assert pbn_publication.versions[0]["baz"] == "quux"
×
369
    assert stare_id == pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
370

371

UNCOV
372
@pytest.mark.django_db
×
UNCOV
373
def test_sync_publication_kasuj_oswiadczenia_przed_blad_400_nie_zaburzy(
×
374
    pbn_client,
375
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
376
    pbn_publication,
377
    pbn_autor,
378
    pbn_jednostka,
379
):
380
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid = pbn_publication
×
381
    pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.save()
×
382

383
    stare_id = pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
384

385
    pbn_client.transport.return_values[PBN_POST_PUBLICATIONS_URL] = {
×
386
        "objectId": pbn_publication.pk
387
    }
388
    pbn_client.transport.return_values[
×
389
        PBN_GET_PUBLICATION_BY_ID_URL.format(id=pbn_publication.pk)
390
    ] = MOCK_RETURNED_MONGODB_DATA
391

392
    url = PBN_DELETE_PUBLICATION_STATEMENT.format(publicationId=pbn_publication.pk)
×
393
    err_json = {
×
394
        "code": 400,
395
        "message": "Bad Request",
396
        "description": "Validation failed.",
397
        "details": {
398
            "publicationId": "Nie można usunąć oświadczeń. Nie istnieją oświadczenia dla publikacji "
399
            "(id = {pbn_publication.pk}) i instytucji (id = XXX)."
400
        },
401
    }
402

403
    pbn_client.transport.return_values[url] = HttpException(
×
404
        400, url, json.dumps(err_json)
405
    )
406

407
    pbn_client.transport.return_values[
×
408
        PBN_GET_INSTITUTION_STATEMENTS + "?publicationId=123&size=5120"
409
    ] = [
410
        {
411
            "id": "eaec3254-2eb1-44d9-8c3c-e68fc2a48bd9",
412
            "addedTimestamp": "2020.05.06",
413
            "institutionId": pbn_jednostka.pbn_uid_id,
414
            "personId": pbn_autor.pbn_uid_id,
415
            "publicationId": pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id,
416
            "area": "200",
417
            "inOrcid": True,
418
            "type": "FOOBAR",
419
        }
420
    ]
421

422
    pbn_client.sync_publication(
×
423
        pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina,
424
        delete_statements_before_upload=True,
425
    )
426

427
    pbn_publication.refresh_from_db()
×
428
    assert pbn_publication.versions[0]["baz"] == "quux"
×
429
    assert stare_id == pbn_wydawnictwo_zwarte_z_autorem_z_dyscyplina.pbn_uid_id
×
430

431

UNCOV
432
def test_get_disciplines(pbn_client):
×
433
    pbn_client.transport.return_values[PBN_GET_DISCIPLINES_URL] = json.loads(
×
434
        open(Path(__file__).parent / "fixture_test_get_disciplines.json", "rb").read()
435
    )
436
    ret = pbn_client.get_disciplines()
×
437
    assert "validityDateFrom" in ret[0]
×
438

439

UNCOV
440
@pytest.mark.django_db
×
UNCOV
441
def test_download_disciplines(pbn_client):
×
442
    pbn_client.transport.return_values[PBN_GET_DISCIPLINES_URL] = json.loads(
×
443
        open(Path(__file__).parent / "fixture_test_get_disciplines.json", "rb").read()
444
    )
445

446
    assert Discipline.objects.count() == 0
×
447
    pbn_client.download_disciplines()
×
448
    assert Discipline.objects.count() != 0
×
449

450

UNCOV
451
@pytest.mark.django_db
×
UNCOV
452
def test_sync_disciplines(pbn_client):
×
453
    pbn_client.transport.return_values[PBN_GET_DISCIPLINES_URL] = json.loads(
×
454
        open(Path(__file__).parent / "fixture_test_get_disciplines.json", "rb").read()
455
    )
456

457
    d1 = Dyscyplina_Naukowa.objects.create(kod="5.1", nazwa="ekonomia i finanse")
×
458
    d2 = Dyscyplina_Naukowa.objects.create(kod="1.6", nazwa="nauka o kulturze")
×
459

460
    assert Dyscyplina_Naukowa.objects.count() == 2
×
461
    pbn_client.sync_disciplines()
×
462

463
    assert Dyscyplina_Naukowa.objects.count() > 2
×
464
    d1.refresh_from_db(), d2.refresh_from_db()
×
465

466
    assert TlumaczDyscyplin.objects.przetlumacz_dyscypline(d1, 2024) is not None
×
467

468
    assert TlumaczDyscyplin.objects.przetlumacz_dyscypline(d2, 2024) is not None
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc