mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-16 05:07:55 +08:00
* fix mispelling * re-implement re-embedding * always load base embedding to fetch counts * format * lint * fix tests * lint * fix accept handling * test log * more debug * more * more * more * more * remove logging * logging * jsonify * remove debugging logs * lint * clean up errors a bit * fix issue found in PR review * add support for corpora default_embedding * fix botched merge * PR review * PR review
147 lines
5.4 KiB
Python
147 lines
5.4 KiB
Python
import unittest
|
|
import anndata
|
|
import json
|
|
import tempfile
|
|
import shutil
|
|
from http import HTTPStatus
|
|
import requests
|
|
|
|
from server.common.corpora import (
|
|
corpora_get_versions_from_anndata,
|
|
corpora_is_version_supported,
|
|
corpora_get_props_from_anndata,
|
|
)
|
|
from server.test import PROJECT_ROOT, start_test_server, stop_test_server
|
|
|
|
VERSION = "v0.2"
|
|
|
|
|
|
class CorporaAPITest(unittest.TestCase):
|
|
def test_corpora_get_versions_from_anndata(self):
|
|
adata = self._get_h5ad()
|
|
|
|
if "version" in adata.uns:
|
|
del adata.uns["version"]
|
|
self.assertIsNone(corpora_get_versions_from_anndata(adata))
|
|
|
|
# something bogus
|
|
adata.uns["version"] = 99
|
|
self.assertIsNone(corpora_get_versions_from_anndata(adata))
|
|
|
|
# something legit
|
|
adata.uns["version"] = {"corpora_schema_version": "0.0.0", "corpora_encoding_version": "9.9.9"}
|
|
self.assertEqual(corpora_get_versions_from_anndata(adata), ["0.0.0", "9.9.9"])
|
|
|
|
def test_corpora_is_version_supported(self):
|
|
self.assertTrue(corpora_is_version_supported("1.0.0", "0.1.0"))
|
|
self.assertFalse(corpora_is_version_supported("0.0.0", "0.1.0"))
|
|
self.assertFalse(corpora_is_version_supported("1.0.0", "0.0.0"))
|
|
|
|
def test_corpora_get_props_from_anndata(self):
|
|
adata = self._get_h5ad()
|
|
|
|
if "version" in adata.uns:
|
|
del adata.uns["version"]
|
|
self.assertIsNone(corpora_get_props_from_anndata(adata))
|
|
|
|
# something bogus
|
|
adata.uns["version"] = 99
|
|
self.assertIsNone(corpora_get_props_from_anndata(adata))
|
|
|
|
# unsupported version, but missing required values
|
|
adata.uns["version"] = {"corpora_schema_version": "99.0.0", "corpora_encoding_version": "32.1.0"}
|
|
with self.assertRaises(ValueError):
|
|
corpora_get_props_from_anndata(adata)
|
|
|
|
# legit version, but missing required values
|
|
adata.uns["version"] = {"corpora_schema_version": "1.0.0", "corpora_encoding_version": "0.1.0"}
|
|
with self.assertRaises(KeyError):
|
|
corpora_get_props_from_anndata(adata)
|
|
|
|
some_fields = {
|
|
"version": {"corpora_schema_version": "1.0.0", "corpora_encoding_version": "0.1.0"},
|
|
"title": "title",
|
|
"layer_descriptions": "layer_descriptions",
|
|
"organism": "organism",
|
|
"organism_ontology_term_id": "organism_ontology_term_id",
|
|
"project_name": "project_name",
|
|
"project_description": "project_description",
|
|
"contributors": json.dumps([{"contributors": "contributors"}]),
|
|
"project_links": json.dumps([{"link_name": "link_name", "link_url": "link_url", "link_type": "SUMMARY"}]),
|
|
}
|
|
for k in some_fields:
|
|
adata.uns[k] = some_fields[k]
|
|
some_fields["contributors"] = json.loads(some_fields["contributors"])
|
|
some_fields["project_links"] = json.loads(some_fields["project_links"])
|
|
self.assertEqual(corpora_get_props_from_anndata(adata), some_fields)
|
|
|
|
def _get_h5ad(self):
|
|
return anndata.read_h5ad(f"{PROJECT_ROOT}/example-dataset/pbmc3k.h5ad")
|
|
|
|
|
|
class CorporaRESTAPITest(unittest.TestCase):
|
|
""" Confirm endpoints reflect Corpora-specific features """
|
|
|
|
@classmethod
|
|
def setCorporaFields(cls, path):
|
|
adata = anndata.read_h5ad(path)
|
|
corpora_props = {
|
|
"version": {
|
|
"corpora_schema_version": "1.0.0",
|
|
"corpora_encoding_version": "0.1.0"
|
|
},
|
|
"title": "PBMC3K",
|
|
"contributors": json.dumps([
|
|
{"name": "name"}
|
|
]),
|
|
"layer_descriptions": {
|
|
"X": "raw counts"
|
|
},
|
|
"organism": "human",
|
|
"organism_ontology_term_id": "unknown",
|
|
"project_name": "test project",
|
|
"project_description": "test description",
|
|
"project_links": json.dumps([
|
|
{"link_name": "test link", "link_type": "SUMMARY", "link_url": "https://a.u.r.l/"}
|
|
]),
|
|
"default_embedding": "X_tsne"
|
|
}
|
|
adata.uns.update(corpora_props)
|
|
adata.write(path)
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.tmp_dir = tempfile.TemporaryDirectory()
|
|
src = f"{PROJECT_ROOT}/example-dataset/pbmc3k.h5ad"
|
|
dst = f"{cls.tmp_dir.name}/pbmc3k.h5ad"
|
|
shutil.copyfile(src, dst)
|
|
cls.setCorporaFields(dst)
|
|
cls.ps, cls.server = start_test_server([dst])
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
stop_test_server(cls.ps)
|
|
cls.tmp_dir.cleanup()
|
|
|
|
def setUp(self):
|
|
self.session = requests.Session()
|
|
self.url_base = f"{self.server}/api/{VERSION}/"
|
|
|
|
def test_config(self):
|
|
endpoint = "config"
|
|
url = f"{self.url_base}{endpoint}"
|
|
result = self.session.get(url)
|
|
self.assertEqual(result.status_code, HTTPStatus.OK)
|
|
self.assertEqual(result.headers["Content-Type"], "application/json")
|
|
|
|
result_data = result.json()
|
|
self.assertIsInstance(result_data["config"]["corpora_props"], dict)
|
|
self.assertIsInstance(result_data["config"]["parameters"], dict)
|
|
|
|
corpora_props = result_data["config"]["corpora_props"]
|
|
parameters = result_data["config"]["parameters"]
|
|
|
|
self.assertEqual(corpora_props["version"]["corpora_schema_version"], "1.0.0")
|
|
self.assertEqual(corpora_props["organism"], "human")
|
|
self.assertEqual(parameters["default_embedding"], "tsne")
|