def test_import_csv_works():
    """Test that CSV imports work properly"""
    USERS_CSV = b"""name,email,password
user1,user1@examplectf.com,password
user2,user2@examplectf.com,password"""

    TEAMS_CSV = b"""name,email,password
team1,team1@examplectf.com,password
team2,team2@examplectf.com,password"""

    CHALLENGES_CSV = b'''name,category,description,value,flags,tags,hints
challenge1,category1,description1,100,"flag1,flag2,flag3","tag1,tag2,tag3","hint1,hint2,hint3"'''

    app = create_ctfd()
    with app.app_context():
        client = login_as_user(app, name="admin", password="password")

        with client.session_transaction() as sess:
            data = {
                "csv_type": "users",
                "csv_file": (io.BytesIO(USERS_CSV), "users.csv"),
                "nonce": sess.get("nonce"),
            }

        client.post("/admin/import/csv", data=data, content_type="multipart/form-data")
        assert Users.query.count() == 3
        user = Users.query.filter_by(id=2).first()
        assert user.name == "user1"
        assert user.email == "user1@examplectf.com"
        assert verify_password("password", user.password)
        user = Users.query.filter_by(id=3).first()
        assert user.name == "user2"
        assert user.email == "user2@examplectf.com"
        assert verify_password("password", user.password)

        with client.session_transaction() as sess:
            data = {
                "csv_type": "teams",
                "csv_file": (io.BytesIO(TEAMS_CSV), "users.csv"),
                "nonce": sess.get("nonce"),
            }
        client.post("/admin/import/csv", data=data, content_type="multipart/form-data")
        assert Teams.query.count() == 2
        team = Teams.query.filter_by(id=1).first()
        assert team.name == "team1"
        assert team.email == "team1@examplectf.com"
        assert verify_password("password", team.password)
        team = Teams.query.filter_by(id=2).first()
        assert team.name == "team2"
        assert team.email == "team2@examplectf.com"
        assert verify_password("password", team.password)

        with client.session_transaction() as sess:
            data = {
                "csv_type": "challenges",
                "csv_file": (io.BytesIO(CHALLENGES_CSV), "challenges.csv"),
                "nonce": sess.get("nonce"),
            }

        client.post("/admin/import/csv", data=data, content_type="multipart/form-data")
        assert Challenges.query.count() == 1
        challenge = Challenges.query.filter_by(id=1).first()
        assert challenge.name == "challenge1"
        assert challenge.category == "category1"
        assert challenge.description == "description1"
        assert challenge.value == 100
        assert len(challenge.flags) == 3
        assert len(challenge.tags) == 3
        assert len(challenge.hints) == 3

    destroy_ctfd(app)
Test that CSV imports work properly
tests/admin/test_csv.py