--- a
+++ b/qiita_pet/test/test_public.py
@@ -0,0 +1,66 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2014--, The Qiita Development Team.
+#
+# Distributed under the terms of the BSD 3-clause License.
+#
+# The full license is in the file LICENSE, distributed with this software.
+# -----------------------------------------------------------------------------
+
+from unittest import main
+
+from qiita_pet.test.tornado_test_base import TestHandlerBase
+from qiita_db.artifact import Artifact
+
+
+class TestPublicHandler(TestHandlerBase):
+    def test_public(self):
+        response = self.get('/public/')
+        self.assertEqual(response.code, 422)
+        self.assertIn("You need to specify study_id or artifact_id",
+                      response.body.decode('ascii'))
+
+        response = self.get('/public/?study_id=100')
+        self.assertEqual(response.code, 422)
+        self.assertIn("Study 100 doesn't exist",
+                      response.body.decode('ascii'))
+
+        response = self.get('/public/?artifact_id=100')
+        self.assertEqual(response.code, 422)
+        self.assertIn("Artifact 100 doesn't exist",
+                      response.body.decode('ascii'))
+
+        response = self.get('/public/?artifact_id=1')
+        self.assertEqual(response.code, 422)
+        self.assertIn("Artifact 1 is not public",
+                      response.body.decode('ascii'))
+
+        response = self.get('/public/?study_id=1')
+        self.assertEqual(response.code, 422)
+        self.assertIn("Not a public study",
+                      response.body.decode('ascii'))
+
+        # artifact 1 is the first artifact within Study 1
+        Artifact(1).visibility = 'public'
+
+        response = self.get('/public/?study_id=1')
+        self.assertEqual(response.code, 200)
+
+        response = self.get('/public/?artifact_id=1')
+        self.assertEqual(response.code, 200)
+
+        response = self.get('/public/?artifact_id=7')
+        self.assertEqual(response.code, 422)
+        self.assertIn("Artifact 7 is not public",
+                      response.body.decode('ascii'))
+
+        # artifact 8 is part of an analysis
+        Artifact(8).visibility = 'public'
+
+        response = self.get('/public/?artifact_id=8')
+        self.assertEqual(response.code, 422)
+        self.assertIn("Artifact 8 doesn't belong to a study",
+                      response.body.decode('ascii'))
+
+
+if __name__ == '__main__':
+    main()