Browse Source

Some fixes and new tests as well

Getty Ritter 4 years ago
parent
commit
4d869061d7
8 changed files with 43 additions and 12 deletions
  1. 2 2
      lc/app.py
  2. 3 0
      lc/error.py
  3. 1 1
      lc/model.py
  4. 1 1
      lc/web.py
  5. 6 3
      scripts/populate.py
  6. 6 2
      stubs/pystache/__init__.py
  7. 1 0
      stubs/pystache/loader.py
  8. 23 3
      tests/routes.py

+ 2 - 2
lc/app.py

@@ -30,8 +30,8 @@ class Index(Endpoint):
 @endpoint("/auth")
 class Auth(Endpoint):
     def api_post(self):
-        _, token = m.User.login(r.User.from_json(flask.request.data))
-        return token
+        _, token = m.User.login(self.request_data(r.User))
+        return {"token": token}
 
 
 @endpoint("/login")

+ 3 - 0
lc/error.py

@@ -43,6 +43,9 @@ class BadPassword(LCException):
     def __str__(self):
         return f"Wrong password for user {self.name}."
 
+    def http_code(self) -> int:
+        return 403
+
 
 @dataclass
 class NotImplemented(LCException):

+ 1 - 1
lc/model.py

@@ -197,4 +197,4 @@ MODELS = [
 
 
 def create_tables():
-    c.DB.create_tables(MODELS, safe=True)
+    c.db.create_tables(MODELS, safe=True)

+ 1 - 1
lc/web.py

@@ -26,7 +26,7 @@ class Endpoint:
 
         # if that exists and we can deserialize it, then make sure
         # it contains a valid user password, too
-        if token and (payload := c.SERIALIZER.loads(token)):
+        if token and (payload := c.serializer.loads(token)):
             if "name" not in payload or "password" not in payload:
                 return
 

+ 6 - 3
scripts/populate.py

@@ -3,13 +3,13 @@
 import datetime
 import json
 
-import lc.config
+import lc.config as c
 import lc.model as m
 import lc.request as r
 
 
 def main():
-    lc.config.db.init("test.db")
+    c.db.init("test.db")
     m.create_tables()
 
     u = m.User.get_or_none(name="gdritter")
@@ -17,6 +17,8 @@ def main():
         u = m.User.from_request(r.User(name="gdritter", password="behest",))
         u.set_as_admin()
 
+    c.log(f"created user {u.name}")
+
     with open("scripts/aisamanra.json") as f:
         links = json.load(f)
     for l in links:
@@ -29,7 +31,8 @@ def main():
             tags=l["tags"].split(),
             created=time,
         )
-        print(m.Link.from_request(u, req))
+        l = m.Link.from_request(u, req)
+        c.log(f"created link {l.url}")
 
 
 if __name__ == "__main__":

+ 6 - 2
stubs/pystache/__init__.py

@@ -2,6 +2,10 @@ from typing import Any, List
 
 import pystache.loader
 
+
 class Renderer:
-    def __init__(self, missing_tags: str, search_dirs: List[str]): pass
-    def render(self, template: Any, kwargs: dict): pass
+    def __init__(self, missing_tags: str, search_dirs: List[str]):
+        pass
+
+    def render(self, template: Any, kwargs: dict):
+        pass

+ 1 - 0
stubs/pystache/loader.py

@@ -1,5 +1,6 @@
 from typing import Any, List
 
+
 class Loader:
     def __init__(self, extension: str, search_dirs: List[str]):
         pass

+ 23 - 3
tests/routes.py

@@ -1,5 +1,8 @@
+import json
+
 import lc.config as c
 import lc.model as m
+import lc.request as r
 import lc.app as a
 
 
@@ -12,9 +15,26 @@ class TestRoutes:
     def teardown_method(self, _):
         c.db.close()
 
-    def get(self, path):
-        return self.app.get(path)
+    def mk_user(self, name="gdritter", password="foo") -> m.User:
+        return m.User.from_request(r.User(name=name, password=password,))
 
     def test_index(self):
-        result = self.get("/")
+        result = self.app.get("/")
+        assert result.status == "200 OK"
+
+    def test_successful_api_login(self):
+        username = "gdritter"
+        password = "bar"
+        u = self.mk_user(password=password)
+        result = self.app.post("/auth", json={"name": username, "password": password,})
         assert result.status == "200 OK"
+        decoded_token = c.serializer.loads(result.json["token"])
+        assert decoded_token["name"] == username
+        assert decoded_token["password"] == password
+
+    def test_failed_api_login(self):
+        username = "gdritter"
+        password = "bar"
+        u = self.mk_user(password=password)
+        result = self.app.post("/auth", json={"name": username, "password": "foo",})
+        assert result.status == "403 FORBIDDEN"