def test_scoreboard_is_cached():
    """Test that /api/v1/scoreboard is properly cached and cleared"""
    app = create_ctfd()
    with app.app_context():
        # create user1
        register_user(app, name="user1", email="user1@examplectf.com")

        # create challenge
        chal = gen_challenge(app.db, value=100)
        gen_flag(app.db, challenge_id=chal.id, content="flag")
        chal_id = chal.id

        # create a solve for the challenge for user1. (the id is 2 because of the admin)
        gen_solve(app.db, user_id=2, challenge_id=chal_id)

        # Initial get_scoreboard_detail cache key version
        saved = app.cache.get("CTFd.utils.scoreboard.get_scoreboard_detail_memver")

        with login_as_user(app, "user1") as client:
            # Check basic scoreboard data
            assert app.cache.get("view/api.scoreboard_scoreboard_list") is None
            client.get("/api/v1/scoreboard")
            assert app.cache.get("view/api.scoreboard_scoreboard_list")

            # Check detailed scoreboard data
            orig = jsonify(get_scoreboard_detail.uncached(count=10)).get_json()
            assert (
                app.cache.get("CTFd.utils.scoreboard.get_scoreboard_detail_memver")
                == saved
            )
            cached = client.get("/api/v1/scoreboard/top/10").get_json()
            assert cached["data"] == orig
            assert app.cache.get("CTFd.utils.scoreboard.get_scoreboard_detail_memver")

            # Check scoreboard page
            assert (
                app.cache.get(make_template_fragment_key("public_scoreboard_table"))
                is None
            )
            client.get("/scoreboard")
            assert app.cache.get(make_template_fragment_key("public_scoreboard_table"))

            # Empty standings and check that the cached data is gone
            clear_standings()
            assert app.cache.get("view/api.scoreboard_scoreboard_list") is None
            # Clearing an entire function bumps flask-cachings version identify instead of setting it to null
            new = app.cache.get("CTFd.utils.scoreboard.get_scoreboard_detail_memver")
            assert new != saved
            assert (
                app.cache.get(make_template_fragment_key("public_scoreboard_table"))
                is None
            )
    destroy_ctfd(app)
Test that /api/v1/scoreboard is properly cached and cleared
tests/api/v1/test_scoreboard.py