def test_publication_status_is_reflected_after_files_expire(self): """The submission has been published/announced, and files expired.""" with self.app.app_context(): session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission.submission_id) db_submission.status = db_submission.DELETED_PUBLISHED dated = (datetime.now() - datetime.utcfromtimestamp(0)) primary = self.submission.primary_classification.category db_submission.document = classic.models.Document( document_id=1, paper_id='1901.00123', title=self.submission.metadata.title, authors=self.submission.metadata.authors_display, dated=dated.total_seconds(), primary_subject_class=primary, created=datetime.now(), submitter_email=self.submission.creator.email, submitter_id=self.submission.creator.native_id ) session.add(db_submission) session.commit() # Submission state should reflect publication status. submission, _ = events.load(self.submission.submission_id) self.assertEqual(submission.status, submission.PUBLISHED, "Submission should have published status.") self.assertEqual(submission.arxiv_id, "1901.00123", "arXiv paper ID should be set") self.assertFalse(submission.active, "Published submission should no longer be active")
def test_submission_placed_on_hold(self): """Before publication, a submission may be placed on hold.""" # Client creates the submission. example = os.path.join(BASEPATH, 'examples/complete_submission.json') with open(example) as f: data = json.load(f) response = self.client.post('/', data=json.dumps(data), content_type='application/json', headers=self.headers) submission_id = json.loads(response.data)['submission_id'] # Moderator, admin, or other agent places the submission on hold. with self.app.app_context(): from events.services import classic session = classic.current_session() submission = session.query(classic.models.Submission) \ .get(submission_id) submission.status = submission.ON_HOLD session.add(submission) session.commit() # Client gets submission state. response = self.client.get(f'/{submission_id}/', headers=self.headers) submission_data = json.loads(response.data) self.assertEqual(submission_data['status'], 'hold', "Status should be `hold`")
def test_sticky_status_is_set(self): """A sticky status is set during moderation.""" # Client creates the submission. example = os.path.join(BASEPATH, 'examples/complete_submission.json') with open(example) as f: data = json.load(f) response = self.client.post('/', data=json.dumps(data), content_type='application/json', headers=self.headers) submission_id = json.loads(response.data)['submission_id'] # Moderator, admin, or other agent places the submission on hold, # and a sticky status is set. with self.app.app_context(): from events.services import classic session = classic.current_session() submission = session.query(classic.models.Submission)\ .get(submission_id) submission.status = submission.ON_HOLD submission.sticky_status = submission.ON_HOLD session.add(submission) session.commit() # Client gets submission state. response = self.client.get(f'/{submission_id}/', headers=self.headers) submission_data = json.loads(response.data) self.assertEqual(submission_data['status'], 'hold', "Status should be `hold`") # Client withdraws the submission from the queue. response = self.client.post(f'/{submission_id}/', data=json.dumps({"finalized": False}), content_type='application/json', headers=self.headers) submission_data = json.loads(response.data) self.assertFalse(submission_data['finalized'], "Should no longer be finalized") # Client gets submission state. response = self.client.get(f'/{submission_id}/', headers=self.headers) submission_data = json.loads(response.data) self.assertFalse(submission_data['finalized'], "Should no longer be finalized") self.assertEqual(submission_data['status'], 'working', "Status should be `working`") # Client finalizes the submission for moderation. response = self.client.post(f'/{submission_id}/', data=json.dumps({"finalized": True}), content_type='application/json', headers=self.headers) submission_data = json.loads(response.data) # Client gets submission state. response = self.client.get(f'/{submission_id}/', headers=self.headers) submission_data = json.loads(response.data) self.assertTrue(submission_data['finalized'], "Should be finalized") self.assertEqual(submission_data['status'], 'hold', "Status should be `hold`, as sticky_status was set")
def in_memory_db(): """Provide an in-memory sqlite database for testing purposes.""" app = Flask('foo') app.config['CLASSIC_DATABASE_URI'] = 'sqlite://' with app.app_context(): classic.init_app(app) classic.create_all() try: yield classic.current_session() except Exception: raise finally: classic.drop_all()
def test_publication_failed(self): """The submission was not published successfully.""" with self.app.app_context(): session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission.submission_id) db_submission.status = db_submission.ERROR_STATE session.add(db_submission) session.commit() # Submission state should reflect scheduled status. submission, _ = events.load(self.submission.submission_id) self.assertEqual(submission.status, submission.ERROR, "Submission should have error status.")
def test_scheduled_tomorrow_status_is_reflected(self): """The submission has been scheduled for publication tomorrow.""" with self.app.app_context(): session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission.submission_id) db_submission.status = db_submission.NEXT_PUBLISH_DAY session.add(db_submission) session.commit() # Submission state should reflect scheduled status. submission, _ = events.load(self.submission.submission_id) self.assertEqual(submission.status, submission.SCHEDULED, "Submission should be scheduled for tomorrow.")
def test_scheduled_status_is_reflected_prior_to_announcement(self): """The submission is being published; not yet announced.""" with self.app.app_context(): session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission.submission_id) db_submission.status = db_submission.NEEDS_EMAIL session.add(db_submission) session.commit() # Submission state should reflect scheduled status. submission, _ = events.load(self.submission.submission_id) self.assertEqual(submission.status, submission.SCHEDULED, "Submission should have scheduled status.")
def test_scheduled_status_is_reflected_processing_submission(self): """The submission has been scheduled for publication today.""" with self.app.app_context(): session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission.submission_id) db_submission.status = db_submission.PROCESSING_SUBMISSION session.add(db_submission) session.commit() # Submission state should reflect scheduled status. submission, _ = events.load(self.submission.submission_id) self.assertEqual(submission.status, submission.SCHEDULED, "Submission should have scheduled status.")
def test_deleted(self): """The submission was deleted.""" with self.app.app_context(): session = classic.current_session() for classic_status in classic.models.Submission.DELETED: # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission.submission_id) db_submission.status = classic_status session.add(db_submission) session.commit() # Submission state should reflect scheduled status. submission, _ = events.load(self.submission.submission_id) self.assertEqual(submission.status, submission.DELETED, "Submission should have deleted status.")
def test_publication_failed(self): """The submission was not published successfully.""" with self.app.app_context(): from events.services import classic session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission_id) db_submission.status = db_submission.ERROR_STATE session.add(db_submission) session.commit() # Submission state should reflect scheduled status. response = self.client.get(f'/{self.submission_id}/', headers=self.headers) submission = json.loads(response.data) self.assertEqual(submission['status'], Submission.ERROR, "Submission should have error status.")
def test_scheduled_tomorrow_status_is_reflected(self): """The submission has been scheduled for publication tomorrow.""" with self.app.app_context(): from events.services import classic session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission_id) db_submission.status = db_submission.NEXT_PUBLISH_DAY session.add(db_submission) session.commit() # Submission state should reflect scheduled status. response = self.client.get(f'/{self.submission_id}/', headers=self.headers) submission = json.loads(response.data) self.assertEqual(submission['status'], Submission.SCHEDULED, "Submission should be scheduled for tomorrow.")
def test_scheduled_status_is_reflected_prior_to_announcement(self): """The submission is being published; not yet announced.""" with self.app.app_context(): from events.services import classic session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission_id) db_submission.status = db_submission.NEEDS_EMAIL session.add(db_submission) session.commit() # Submission state should reflect scheduled status. response = self.client.get(f'/{self.submission_id}/', headers=self.headers) submission = json.loads(response.data) self.assertEqual(submission['status'], Submission.SCHEDULED, "Submission should have scheduled status.")
def test_deleted(self): """The submission was deleted.""" with self.app.app_context(): from events.services import classic session = classic.current_session() for classic_status in classic.models.Submission.DELETED: # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission_id) db_submission.status = classic_status session.add(db_submission) session.commit() # Submission state should reflect scheduled status. response = self.client.get(f'/{self.submission_id}/', headers=self.headers) submission = json.loads(response.data) self.assertEqual(submission['status'], Submission.DELETED, "Submission should have deleted status.")
def test_publication_status_is_reflected_after_files_expire(self): """The submission has been published/announced, and files expired.""" with self.app.app_context(): from events.services import classic session = classic.current_session() # Publication agent publishes the paper. db_submission = session.query(classic.models.Submission)\ .get(self.submission_id) db_submission.status = db_submission.DELETED_PUBLISHED dated = (datetime.now() - datetime.utcfromtimestamp(0)) primary = self.submission['primary_classification']['category'] db_submission.document = classic.models.Document( document_id=1, paper_id='1901.00123', title=self.submission['metadata']['title'], authors=self.submission['metadata']['authors_display'], dated=dated.total_seconds(), primary_subject_class=primary, created=datetime.now(), submitter_email=self.submission['creator']['email'], submitter_id=self.submission['creator']['user_id'] ) session.add(db_submission) session.commit() # Submission state should reflect publication status. response = self.client.get(f'/{self.submission_id}/', headers=self.headers) submission = json.loads(response.data) self.assertEqual(submission['status'], Submission.PUBLISHED, "Submission should have published status.") self.assertEqual(submission['arxiv_id'], "1901.00123", "arXiv paper ID should be set") self.assertFalse(submission['active'], "Published submission should no longer be active")