def test_article_unpublished_version_not_returned(self): "unpublished article versions are not returned" self.unpublish(self.msid2, version=3) self.assertEqual( models.ArticleVersion.objects.filter( article__manuscript_id=self.msid2).exclude( datetime_published=None).count(), 2) resp = self.c.get(reverse('v2:article', kwargs={'id': self.msid2})) self.assertEqual(resp.status_code, 200) data = utils.json_loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['poa']) # correct data self.assertEqual(data['version'], 2) # third version was unpublished # list of versions version_list = self.c.get( reverse('v2:article-version-list', kwargs={'id': self.msid2})) self.assertEqual(version_list.status_code, 200) version_list_data = utils.json_loads(version_list.content) self.assertEqual(len(version_list_data['versions']), 2) # directly trying to access the unpublished version unpublished_version = self.c.get( reverse('v2:article-version', kwargs={ 'id': self.msid2, 'version': 3 })) self.assertEqual(unpublished_version.status_code, 404)
def test_unpublished_article_versions_list(self): "valid json content is returned" # 2016-07-21: lax used to depend on certain values from ejp, but these are now pulled from the xml. # we need some data that can only come from ejp for this # import ejp_ingestor # ejp_data = join(self.fixture_dir, 'dummy-ejp-for-v2-api-fixtures.json') # ejp_ingestor.import_article_list_from_json_path(logic.journal(), ejp_data, create=False, update=True) resp = self.ac.get( reverse('v2:article-version-list', kwargs={'id': self.msid2})) self.assertEqual(resp.status_code, 200) self.assertEqual( resp.content_type, 'application/vnd.elife.article-history+json;version=1') data = utils.json_loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['history']) # correct data self.assertEqual( len(data['versions']), 3) # this article has two *published*, one *unpublished* # correct order expected = [1, 2, 3] given = [data['versions'][i]['version'] for i in range(0, 3)] self.assertEqual(given, expected)
def test_article_poa_unpublished(self): "the latest version of the requested article is returned" resp = self.ac.get(reverse('v2:article', kwargs={'id': self.msid2})) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, "application/vnd.elife.article-poa+json;version=1") data = json.loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['poa']) # correct data self.assertEqual(data['version'], 3)
def test_article_poa_unpublished(self): "the latest version of the requested article is returned" resp = self.ac.get(reverse('v2:article', kwargs={'id': self.msid2})) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, "application/vnd.elife.article-poa+json;version=1") data = utils.json_loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['poa']) # correct data self.assertEqual(data['version'], 3)
def test_article_unpublished_ver_not_returned(self): "unpublished article versions are not returned" self.unpublish(self.msid2, version=3) self.assertEqual(models.ArticleVersion.objects.filter(article__manuscript_id=self.msid2).exclude(datetime_published=None).count(), 2) resp = self.c.get(reverse('v2:article', kwargs={'id': self.msid2})) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['poa']) # correct data self.assertEqual(data['version'], 2) # third version was unpublished
def test_article_list_paginated_page2(self): "a list of articles are returned, paginated by 1" resp = self.c.get(reverse('v2:article-list') + "?per-page=1&page=2") self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/vnd.elife.article-list+json;version=1') data = json.loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['list']) # correct data self.assertEqual(len(data['items']), 1) # ONE result, [msid2] self.assertEqual(data['total'], 2) self.assertEqual(data['items'][0]['id'], str(self.msid2))
def test_article_list_paginated_page2(self): "a list of articles are returned, paginated by 1" resp = self.c.get(reverse('v2:article-list') + "?per-page=1&page=2") self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/vnd.elife.article-list+json;version=1') data = utils.json_loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['list']) # correct data self.assertEqual(len(data['items']), 1) # ONE result, [msid2] self.assertEqual(data['total'], 2) self.assertEqual(data['items'][0]['id'], str(self.msid2))
def test_article_list(self): "a list of published articles are returned to an unauthenticated response" resp = self.c.get(reverse('v2:article-list')) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/vnd.elife.article-list+json;version=1') data = json.loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['list']) # correct data self.assertEqual(data['total'], 2) # two results, [msid1, msid2] av1, av2 = data['items'] self.assertEqual(av1['version'], 2) self.assertEqual(av2['version'], 3)
def test_unpublished_article_versions_list(self): "valid json content is returned" # we need some data that can only come from ejp for this ejp_data = join(self.fixture_dir, 'dummy-ejp-for-v2-api-fixtures.json') ejp_ingestor.import_article_list_from_json_path(logic.journal(), ejp_data, create=False, update=True) resp = self.ac.get(reverse('v2:article-version-list', kwargs={'id': self.msid2})) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/vnd.elife.article-history+json;version=1') data = json.loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['history']) # correct data self.assertEqual(len(data['versions']), 3) # this article has two *published*, one *unpublished*
def test_article_list_including_unpublished(self): "a list of published and unpublished articles are returned to an authorized response" resp = self.ac.get(reverse('v2:article-list')) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/vnd.elife.article-list+json;version=1') self.assertEqual(resp[settings.KONG_AUTH_HEADER], 'True') data = json.loads(resp.content) idx = {int(item['id']): item for item in data['items']} # valid data utils.validate(data, SCHEMA_IDX['list']) # correct data self.assertEqual(data['total'], 2) # two results, [msid1, msid2] self.assertEqual(idx[self.msid1]['version'], 3) # we get the unpublished v3 back self.assertEqual(idx[self.msid2]['version'], 3)
def test_article_list_including_unpublished(self): "a list of published and unpublished articles are returned to an authorized response" resp = self.ac.get(reverse('v2:article-list')) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/vnd.elife.article-list+json;version=1') self.assertEqual(resp[settings.KONG_AUTH_HEADER], 'True') data = utils.json_loads(resp.content) idx = {int(item['id']): item for item in data['items']} # valid data utils.validate(data, SCHEMA_IDX['list']) # correct data self.assertEqual(data['total'], 2) # two results, [msid1, msid2] self.assertEqual(idx[self.msid1]['version'], 3) # we get the unpublished v3 back self.assertEqual(idx[self.msid2]['version'], 3)
def test_article_list(self): "a list of published articles are returned to an unauthenticated response" resp = self.c.get(reverse('v2:article-list')) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, 'application/vnd.elife.article-list+json;version=1') data = utils.json_loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['list']) # correct data self.assertEqual(data['total'], 2) # two results, [msid1, msid2] # FIXME: non-deterministic insertion order. sometimes you get av2, av1 ... av1, av2 = data['items'] # print(data['items']) self.assertEqual(av1['version'], 2) self.assertEqual(av2['version'], 3)
def test_article_versions_list(self): "valid json content is returned" resp = self.c.get( reverse('v2:article-version-list', kwargs={'id': self.msid2})) self.assertEqual(resp.status_code, 200) self.assertEqual( resp.content_type, 'application/vnd.elife.article-history+json;version=1') data = utils.json_loads(resp.content) # valid data utils.validate(data, SCHEMA_IDX['history']) # correct data self.assertEqual(len(data['versions']), 2) # this article only has two *published* # correct order expected = [1, 2] given = [data['versions'][i]['version'] for i in range(0, 2)] self.assertEqual(given, expected)
def test_all(self): v1, v2, v12 = 1, 2, 12 cases = [ # content, request, response #(v1, v1, v1), #(v1, v2, v2), (v2, v1, v1), (v2, v2, v2), #(v1, v12, v2), (v2, v12, v2), ] content_idx = { v1: self.ajson_fixture_api1, v2: self.ajson_fixture_api2 } request_idx = { v1: 'application/vnd.elife.article-poa+json; version=1', v2: 'application/vnd.elife.article-poa+json; version=2', v12: 'application/vnd.elife.article-poa+json; version=1, application/vnd.elife.article-poa+json; version=2', } response_idx = { v1: self.ajson_api1, v2: self.ajson_api2 } schema_idx = { v1: settings.ALL_SCHEMA_IDX[self.status][1][1], v2: settings.ALL_SCHEMA_IDX[self.status][0][1], } for ckey, rqkey, rskey in cases: content = content_idx[ckey] request = request_idx[rqkey] response = response_idx[rskey] name = ' '.join(map(str, [ckey, rqkey, rskey])) # print(name) with self.subTest(name): try: # Lax needs a v1 before a v2 can be published self.add_or_update_article(**{ 'manuscript_id': self.msid, 'version': 1, 'published': '2017-07-11T00:00:00Z' }) self.publish_ajson(content) actual_resp = self.c.get(reverse('v2:article', kwargs={'id': self.msid}), HTTP_ACCEPT=request) self.assertEqual(actual_resp.status_code, 200) # response is valid self.assertTrue(utils.validate(actual_resp.json(), schema_idx[rskey])) # response is equal to what we're expecting actual_json = self.load_ajson2(actual_resp.json()) # slightly more isolated error messages self.assertEqual(actual_json.keys(), response.keys()) for key in response.keys(): self.assertEqual(actual_json.get(key), response.get(key)) finally: models.Article.objects.all().delete()