-
Notifications
You must be signed in to change notification settings - Fork 80
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
log user creation timestamp #3416
Merged
Merged
Changes from all commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
867c19e
use SQL's NOW() fct to log creation of a new user account (validated …
sjanssen2 c94ccb9
at -> on
sjanssen2 ca55a2f
add new col
sjanssen2 1488be7
use patch for DB changes
sjanssen2 3c75556
forgot to remove addition of comment here
sjanssen2 dd0ee74
moving changes to patch 92
sjanssen2 6769053
move adding date from populate_test_db.sql to here
sjanssen2 2ef5de7
revert changes, see patch
sjanssen2 862eb20
Merge branch 'dev' of https://github.com/qiita-spots/qiita into log_u…
sjanssen2 9260ac5
adding table name :-/
sjanssen2 b883817
order in DB changed due to UPDATE of creation_timestamp for user test…
sjanssen2 6601e24
fix test
sjanssen2 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -51,10 +51,11 @@ def test_get(self): | |
|
||
obs = loads(obs.body) | ||
exp = {'data': [ | ||
{'email': '[email protected]', 'name': 'Dude'}, | ||
{'email': '[email protected]', 'name': 'Shared'}, | ||
{'email': '[email protected]', 'name': 'Admin'}, | ||
{'email': '[email protected]', 'name': 'Demo'}]} | ||
{'email': '[email protected]', 'name': 'Demo'}, | ||
{'email': '[email protected]', 'name': 'Dude'} | ||
]} | ||
self.assertEqual(obs, exp) | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,3 +30,16 @@ ALTER TABLE qiita.prep_template ADD current_human_filtering boolean DEFAULT Fals | |
-- Adding a new column: reprocess_job_id to qiita.prep_template to keep track of | ||
-- the job that reprocessed this prep | ||
ALTER TABLE qiita.prep_template ADD reprocess_job_id uuid DEFAULT NULL; | ||
|
||
-- Jun 19, 2024 | ||
-- Adding a new column to the user table that logs when this account was created | ||
-- Usefull e.g. to prune non-verified=inactive user or to plot user growth | ||
|
||
ALTER TABLE qiita.qiita_user | ||
ADD creation_timestamp timestamp without time zone DEFAULT NOW(); | ||
|
||
COMMENT ON COLUMN qiita.qiita_user.creation_timestamp IS 'The date the user account was created'; | ||
|
||
-- for testing: provide creation date for one of the existing users | ||
|
||
UPDATE qiita.qiita_user SET creation_timestamp = '2015-12-03 13:52:42.751331-07' WHERE email = '[email protected]'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -75,7 +75,8 @@ def setUp(self): | |
'receive_processing_job_emails': True, | ||
'social_orcid': None, | ||
'social_researchgate': None, | ||
'social_googlescholar': None | ||
'social_googlescholar': None, | ||
'creation_timestamp': datetime(2015, 12, 3, 13, 52, 42, 751331) | ||
} | ||
|
||
def tearDown(self): | ||
|
@@ -88,7 +89,22 @@ def test_instantiate_unknown_user(self): | |
with self.assertRaises(qdb.exceptions.QiitaDBUnknownIDError): | ||
qdb.user.User('[email protected]') | ||
|
||
def _check_correct_info(self, obs, exp): | ||
def _check_correct_info(self, obs, exp, ts_before=None): | ||
"""Compares info dict of user with special handling of specific keys. | ||
|
||
Parameters | ||
---------- | ||
obs : dict | ||
Observed user info dictionary. | ||
exp : dict | ||
Expected user info dictionary. | ||
ts_before : datetime.datetime or None | ||
User.create records the creation timestamp through SQL's NOW(). | ||
Since it is set by the database to the microsecond, we can't | ||
predict it a priori and therefore simply record timestamp before | ||
execution of user.create() and compare the relation. | ||
The DB creation_timestamp column is optional, i.e. can be None. | ||
""" | ||
self.assertEqual(set(exp.keys()), set(obs.keys())) | ||
for key in exp: | ||
# user_verify_code and password seed randomly generated so just | ||
|
@@ -97,10 +113,14 @@ def _check_correct_info(self, obs, exp): | |
self.assertEqual(len(obs[key]), 20) | ||
elif key == "password": | ||
self.assertEqual(len(obs[key]), 60) | ||
elif key == "creation_timestamp": | ||
self.assertTrue(((exp[key] is None) and (obs[key] is None)) | ||
or (ts_before <= exp[key])) | ||
else: | ||
self.assertEqual(obs[key], exp[key]) | ||
|
||
def test_create_user(self): | ||
before = datetime.now() | ||
user = qdb.user.User.create('[email protected]', 'password') | ||
|
||
# adding a couple of messages | ||
|
@@ -131,8 +151,9 @@ def test_create_user(self): | |
'email': '[email protected]', | ||
'social_orcid': None, | ||
'social_researchgate': None, | ||
'social_googlescholar': None} | ||
self._check_correct_info(obs, exp) | ||
'social_googlescholar': None, | ||
'creation_timestamp': datetime.now()} | ||
self._check_correct_info(obs, exp, before) | ||
|
||
# Make sure new system messages are linked to user | ||
sql = """SELECT message_id FROM qiita.message_user | ||
|
@@ -146,6 +167,7 @@ def test_create_user(self): | |
qdb.util.clear_system_messages() | ||
|
||
def test_create_user_info(self): | ||
before = datetime.now() | ||
user = qdb.user.User.create('[email protected]', 'password', | ||
self.userinfo) | ||
self.assertEqual(user.id, '[email protected]') | ||
|
@@ -171,8 +193,9 @@ def test_create_user_info(self): | |
'email': '[email protected]', | ||
'social_orcid': None, | ||
'social_researchgate': None, | ||
'social_googlescholar': None} | ||
self._check_correct_info(obs, exp) | ||
'social_googlescholar': None, | ||
'creation_timestamp': datetime.now()} | ||
self._check_correct_info(obs, exp, before) | ||
|
||
def test_create_user_column_not_allowed(self): | ||
self.userinfo["email"] = "FAIL" | ||
|
@@ -241,8 +264,20 @@ def test_get_info(self): | |
'phone': '222-444-6789', | ||
'social_orcid': None, | ||
'social_researchgate': None, | ||
'social_googlescholar': None | ||
'social_googlescholar': None, | ||
'creation_timestamp': datetime(2015, 12, 3, 13, 52, 42, 751331) | ||
} | ||
|
||
# test database is re-populated during testing several times. | ||
# Creation_timestamp depends on the percise timing of the repopulation, | ||
# i.e. we cannot predict its value. We just test that this date should | ||
# be within an hour and now. For the remainder of tests, we update | ||
# our expectation. | ||
self.assertTrue(datetime.now() - timedelta(hours=1) < | ||
self.user.info['creation_timestamp'] < | ||
datetime.now()) | ||
expinfo['creation_timestamp'] = self.user.info['creation_timestamp'] | ||
|
||
self.assertEqual(self.user.info, expinfo) | ||
|
||
def test_set_info(self): | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The issue with this test and my suggestion about using now() in the database is that there is going to be a small difference on the tests so they will need to be adjusted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tried to account for these unpredictable time differences with your "before < obs < after" assertions, e.g. here https://github.com/jlab/qiita/blob/1488be79e9468e240ea318ae8920fd6559030307/qiita_db/test/test_user.py#L170-L198