def test_oais_fail_transfer(db): """Test the oais_fail_transfer function.""" # let's create a SIP sip = SIP.create() Archive.create(sip) db.session.commit() # we fail the transfer oais_fail_transfer(sip.id) assert Archive.query.count() == 1 ark = Archive.get_from_sip(sip.id) assert ark.status == ArchiveStatus.FAILED
def test_oais_process_transfer(db): """Test the oais_process_transfer function.""" # let's create a SIP sip = SIP.create() Archive.create(sip) db.session.commit() aipid = uuid.uuid4() oais_process_transfer(sip.id, archivematica_id=aipid) assert Archive.query.count() == 1 ark = Archive.get_from_sip(sip.id) assert ark.status == ArchiveStatus.PROCESSING_TRANSFER assert ark.archivematica_id == aipid
def test_oais_finish_transfer(db): """Test the oais_finish_transfer function.""" # let's create a SIP sip = SIP.create() Archive.create(sip) aipid = uuid.uuid4() db.session.commit() # we finish the transfer oais_finish_transfer(sip.id, archivematica_id=aipid) assert Archive.query.count() == 1 ark = Archive.get_from_sip(sip.id) assert ark.status == ArchiveStatus.REGISTERED assert ark.archivematica_id == aipid assert ark.sip.archived is True
def test_Archive_get_realstatus_transfer(db, client, oauth2): """Test the Archive's get method with transfer processing.""" sip = SIP.create() ark = Archive.create(sip=sip, accession_id='id', archivematica_id=uuid.uuid4()) ark.status = ArchiveStatus.WAITING db.session.commit() mock_response = Response() mock_response.status_code = 200 mock_response._content = json.dumps({ 'status': 'SIP_PROCESSING' }).encode('utf-8') with patch('requests.get', return_value=mock_response): response = client.get(url_for('invenio_archivematica_api.archive_api', accession_id=ark.accession_id, access_token=oauth2.token), data=json.dumps({'realStatus': True}), content_type='application/json') assert response.status_code == 200 result = json.loads(response.data.decode('utf-8')) assert 'sip_id' in result and result['sip_id'] == str(sip.id) assert 'status' in result and result['status'] == 'PROCESSING_TRANSFER' assert 'accession_id' in result and result['accession_id'] == 'id' assert 'archivematica_id' in result \ and result['archivematica_id'] == str(ark.archivematica_id)
def listener_sip_created(sip, *args, **kwargs): """Create an entry in the database when a sip is created.""" imp = current_app.config['ARCHIVEMATICA_ISARCHIVABLE_FACTORY'] is_archivable = import_string(imp) if imp else None ark = Archive.create(sip.model) if not is_archivable or not is_archivable(sip): ark.status = ArchiveStatus.IGNORED
def oais_start_transfer(uuid, accession_id='', archivematica_id=None): """Archive a sip. This function should be called to start a transfer to archive a sip. Once the transfer is finished, you should call :py:func:`invenio_archivematica.tasks.oais_finish_transfer`. The signal :py:data:`invenio_archivematica.signals.oais_transfer_started` is called with the sip as function parameter. :param str uuid: the UUID of the sip to archive :param str accession_id: the AIP accession ID. You can generate one from :py:func:`invenio_archivematica.factories.create_accession_id` """ # we get the sip sip = SIP.get_sip(uuid) # we register the sip as being processed ark = Archive.get_from_sip(uuid) if not ark: ark = Archive.create(sip.model) ark.accession_id = accession_id ark.status = ArchiveStatus.WAITING # we start the transfer imp = current_app.config['ARCHIVEMATICA_TRANSFER_FACTORY'] transfer = import_string(imp) ret = transfer(sip.id, current_app.config['ARCHIVEMATICA_TRANSFER_FOLDER']) if ret == 0: db.session.commit() oais_transfer_started.send(sip) return oais_fail_transfer(uuid, accession_id)
def test_create_accessioned_id(db): """Test ``create_accessioned_id`` function.""" # First, we create a SIP sip = SIP.create() ark = Archive.create(sip) db.session.commit() accessioned_id = factories.create_accession_id(ark) assert accessioned_id == 'CERN-' + str(sip.id)
def test_create_accessioned_id(db): """Test ``create_accessioned_id`` function.""" # First, we create a SIP sip = SIP.create() ark = Archive.create(sip) db.session.commit() accessioned_id = factories.create_accession_id(ark) assert accessioned_id \ == current_app.config['ARCHIVEMATICA_ORGANIZATION_NAME'] + '-' \ + str(sip.id)
def test_ArchiveDownload_get_412(db, client, oauth2): """Test the Download's get method with no archivematica_id.""" sip = SIP.create() ark = Archive.create(sip=sip, accession_id='id') db.session.commit() response = client.get( url_for('invenio_archivematica_api.download_api', accession_id=ark.accession_id, access_token=oauth2.token)) assert response.status_code == 412
def test_ArchiveDownload_get_520(db, client, oauth2): """Test the Download's get method with no storage server running.""" sip = SIP.create() ark = Archive.create(sip=sip, accession_id='id', archivematica_id=uuid.uuid4()) ark.status = ArchiveStatus.REGISTERED db.session.commit() response = client.get( url_for('invenio_archivematica_api.download_api', accession_id=ark.accession_id, access_token=oauth2.token)) assert response.status_code == 520
def test_archive_new_sips(db, location): """Test the archive_new_sips function.""" # we create 2 SIP sip1 = SIP.create() Archive.create(sip1) db.session.commit() time.sleep(3) sip2 = SIP.create() Archive.create(sip2) db.session.commit() # we archive all records older than 2 seconds archive_new_sips('invenio_archivematica.factories.create_accession_id', days=0, seconds=2, delay=False) arks = Archive.query.all() assert len(arks) == 2 for ark in arks: if ark.sip_id == sip1.id: assert ark.status == ArchiveStatus.WAITING # we update the archive so it will be ignored in what follows ark.status = ArchiveStatus.IGNORED db.session.commit() else: assert ark.status == ArchiveStatus.NEW # now we archive everything, but rec2 shouldn't be archived as it is # flagged as IGNORED archive_new_sips('invenio_archivematica.factories.create_accession_id', days=0, delay=False) arks = Archive.query.all() assert len(arks) == 2 for ark in arks: if ark.sip_id == sip1.id: assert ark.status == ArchiveStatus.IGNORED else: assert ark.status == ArchiveStatus.WAITING
def test_oais_start_transfer(app, db, location): """Test the oais_start_transfer function.""" assert Archive.query.count() == 0 # let's create a SIP sip = SIP.create() Archive.create(sip) db.session.commit() assert Archive.query.count() == 1 # we start the transfer oais_start_transfer(sip.id, '1991') ark = Archive.get_from_sip(sip.id) assert ark.status == ArchiveStatus.WAITING assert ark.accession_id == '1991' # we try the case where no archive exist and transfer fails db.session.delete(ark) db.session.commit() app.config['ARCHIVEMATICA_TRANSFER_FACTORY'] = 'helpers:transfer_fail' assert Archive.query.count() == 0 oais_start_transfer(sip.id, '1991') ark = Archive.get_from_sip(sip.id) assert Archive.query.count() == 1 assert ark.status == ArchiveStatus.FAILED assert ark.accession_id == '1991' assert ark.sip.archived is False
def test_ArchiveDownload_get_status_code(db, client, oauth2): """Test the API request for Download's get method.""" sip = SIP.create() ark = Archive.create(sip=sip, accession_id='id', archivematica_id=uuid.uuid4()) ark.status = ArchiveStatus.REGISTERED db.session.commit() mock_response = Response() mock_response.status_code = 404 with patch('requests.get', return_value=mock_response): response = client.get( url_for('invenio_archivematica_api.download_api', accession_id=ark.accession_id, access_token=oauth2.token)) assert response.status_code == mock_response.status_code
def test_Archive_get_status_code(db, client, oauth2): """Test the Archive's get method with error on Archivematica.""" sip = SIP.create() ark = Archive.create(sip=sip, accession_id='id', archivematica_id=uuid.uuid4()) ark.status = ArchiveStatus.WAITING db.session.commit() mock_response = Response() mock_response.status_code = 404 with patch('requests.get', return_value=mock_response): response = client.get(url_for('invenio_archivematica_api.archive_api', accession_id=ark.accession_id, access_token=oauth2.token), data=json.dumps({'realStatus': True}), content_type='application/json') assert response.status_code == mock_response.status_code
def test_Archive_get_200(db, client, oauth2): """Test the Archive's get method with no archivematica_id.""" sip = SIP.create() ark = Archive.create(sip=sip, accession_id='id', archivematica_id=uuid.uuid4()) db.session.commit() response = client.get( url_for('invenio_archivematica_api.archive_api', accession_id=ark.accession_id, access_token=oauth2.token)) assert response.status_code == 200 result = json.loads(response.data.decode('utf-8')) assert 'sip_id' in result and result['sip_id'] == str(sip.id) assert 'status' in result and result['status'] == 'NEW' assert 'accession_id' in result and result['accession_id'] == 'id' assert 'archivematica_id' in result \ and result['archivematica_id'] == str(ark.archivematica_id)
def test_Archive_patch_200(db, client, oauth2): """Test the Archive's get method with no archivematica_id.""" sip = SIP.create() ark = Archive.create(sip=sip, accession_id='id') db.session.commit() params = {'archivematica_id': str(uuid.uuid4()), 'status': 'COMPLETE'} response = client.patch(url_for('invenio_archivematica_api.archive_api', accession_id=ark.accession_id, access_token=oauth2.token), data=json.dumps(params), content_type='application/json') assert response.status_code == 200 result = json.loads(response.data.decode('utf-8')) assert 'sip_id' in result and result['sip_id'] == str(sip.id) assert 'status' in result and result['status'] == 'REGISTERED' assert 'accession_id' in result and result['accession_id'] == 'id' assert 'archivematica_id' in result \ and result['archivematica_id'] == params['archivematica_id'] ark = Archive.query.one() assert ark.status == ArchiveStatus.REGISTERED assert str(ark.archivematica_id) == params['archivematica_id']