def test_pre_patch_hook(self): """ Make sure pre_patch hook executes successfully """ client = TestClient( PiccoloCRUD( table=Movie, read_only=False, hooks=[ Hook(hook_type=HookType.pre_patch, callable=remove_spaces) ], )) movie = Movie(name="Star Wars", rating=93) movie.save().run_sync() new_name = "Star Wars: A New Hope" new_name_modified = new_name.replace(" ", "") response = client.patch(f"/{movie.id}/", json={"name": new_name}) self.assertTrue(response.status_code == 200) # Make sure the row is returned: response_json = json.loads(response.json()) self.assertTrue(response_json["name"] == new_name_modified) # Make sure the underlying database row was changed: movies = Movie.select().run_sync() self.assertTrue(movies[0]["name"] == new_name_modified)
def test_pre_patch_hook_db_lookup(self): """ Make sure pre_patch hook can perform db lookups (function will always reset "name" to the original name) """ client = TestClient( PiccoloCRUD( table=Movie, read_only=False, hooks=[ Hook(hook_type=HookType.pre_patch, callable=look_up_existing) ], )) original_name = "Star Wars" movie = Movie(name="Star Wars", rating=93) movie.save().run_sync() new_name = "Star Wars: A New Hope" response = client.patch(f"/{movie.id}/", json={"name": new_name}) self.assertTrue(response.status_code == 200) response_json = json.loads(response.json()) self.assertTrue(response_json["name"] == original_name) movies = Movie.select().run_sync() self.assertTrue(movies[0]["name"] == original_name)
def test_multi_pre_post_hooks(self): """ Make sure multiple hooks execute in correct order """ client = TestClient( PiccoloCRUD( table=Movie, read_only=False, hooks=[ Hook( hook_type=HookType.pre_save, callable=set_movie_rating_10, ), Hook( hook_type=HookType.pre_save, callable=set_movie_rating_20, ), ], )) json_req = {"name": "Star Wars", "rating": 93} _ = client.post("/", json=json_req) movie = Movie.objects().first().run_sync() self.assertEqual(movie.rating, 20)
def test_delete_hook_fails(self): """ Make sure failing pre_delete hook bubbles up (this implicitly also tests that pre_delete hooks execute) """ client = TestClient( PiccoloCRUD( table=Movie, read_only=False, hooks=[ Hook(hook_type=HookType.pre_delete, callable=failing_hook) ], )) movie = Movie(name="Star Wars", rating=10) movie.save().run_sync() with self.assertRaises(Exception): _ = client.delete(f"/{movie.id}/")