Skip to content

Conversation

@jbriones1
Copy link
Contributor

depends on #126

  • Added basic integration tests for the Nominees endpoints
  • TODO: Once the checks for election officers is completed, create the rest of the tests for election officers

* refactored how the election officers are looked up
* changed the Nominee put back to a patch
* made election tests work with the new testing setup
@jbriones1 jbriones1 requested a review from p-north January 2, 2026 07:01
@jbriones1 jbriones1 changed the title Feature: Nominee tests Test: Nominee endpoint Jan 2, 2026
@jbriones1 jbriones1 marked this pull request as ready for review January 3, 2026 21:25
query = query.where(BlogPosts.title == title)

# should return the one entry with an unique title
post = await db_session.scalar(query)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit pick: might wanna check if post is none

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like the whole Blog module is a mess. It showed up here since I ran a formatter over everything. Blogs will be addressed in a future update.

Comment on lines +54 to +55
query = query.where(BlogPosts.post_tags in tags).where(BlogPosts.last_edited).order_by(BlogPosts.last_edited.desc())
# .all() should return a list of all the posts
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

slight syntax issue for sqlalchemy. BlogPosts.post_tags in tags is invalid syntax

Correction: query = query.where(BlogPosts.post_tags.contains(tags)).order_by(BlogPosts.last_edited.desc())

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like the whole Blog module is a mess. It showed up here since I ran a formatter over everything. Blogs will be addressed in a future update.

detail="candidate is already registered for that position",
)

registration.update_from_params(body)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might want to await this

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing asynchronous about this function.

def update_from_params(self, params: CandidateUpdate):
    update_data = params.model_dump(exclude_unset=True)
    for k, v in update_data.items():
        setattr(self, k, v)

The commit on line 176 should update the candidate at this point.

Based off this: https://docs.sqlalchemy.org/en/21/tutorial/orm_data_manipulation.html#updating-orm-objects-using-the-unit-of-work-pattern

@jbriones1 jbriones1 requested a review from p-north January 25, 2026 01:03
Copy link
Contributor

@p-north p-north left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the delay, just been trying to balance work and other things! Hopefully its better now.

Everything looks good. Just some minor nitpicks here and there.

Comment on lines 11 to 20
@@ -12,26 +16,105 @@
"phone_number",
"github_username",
"google_drive_email",
"photo_url"
"photo_url",
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this was already here from before, but maybe if it's not being used, we can get rid of it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'd be losing everything from that field when you do the database migration.

Comment on lines +71 to +72
start_date: date | None = None
end_date: date | None = None
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-might want to validate the start_date and end_date but its not a big deal.

sqlalchemy
.select(OfficerInfo)
.where(OfficerInfo.computing_id == new_officer_info.computing_id)
sqlalchemy.select(OfficerInfoDB).where(OfficerInfoDB.computing_id == new_officer_info.computing_id)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you might be missing the sqlalchemy import.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's on line 8

password=DB_PASSWORD,
database="postgres",
host="sfucsss.org", # NOTE: this should point to the old sfucsss.org server (made initially by jace)
host="sfucsss.org", # NOTE: this should point to the old sfucsss.org server (made initially by jace)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this was here before, but maybe we shouldn't hard code this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We shouldn't, but this script was for migrating before we took down the old site.



@pytest_asyncio.fixture(scope="module", loop_scope="session")
async def client() -> AsyncGenerator[Any, None]:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missing import for AsyncGenerator, Any

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lines 3 and 4

async def test__admin_delete_nominee(admin_client: AsyncClient):
response = await admin_client.delete(f"/nominee/{TEST_NOMINEE['computing_id']}")
assert response.status_code == HTTPStatus.OK
assert response.json()["success"]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is asserting thruthiness not correctness.
Consider:
assert response.json() == {"success": True}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It works fine when running the test. I changed the response to False and it correctly catches the assert. What's wrong with this?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I prefer Jon's approach since it's more stable we decide to add extra fields and allow us to do more granular tests on the fields separately.

Though I would like to add is True or is False to be more explicit

assert response.json()["success"] is True

# more fields in the future rather than simple equality
assert response.json()["remaining_nominiees"], "There should be more nominees"

Copy link
Contributor Author

@jbriones1 jbriones1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed some comments

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants