Add user follows to following feed
This commit is contained in:
@@ -34,15 +34,26 @@ class FeatureApiTests(unittest.TestCase):
|
||||
with main.get_db_connection() as db:
|
||||
db.execute('''
|
||||
CREATE TABLE users(id SERIAL PRIMARY KEY, username TEXT UNIQUE, email TEXT UNIQUE,
|
||||
display_name TEXT, password_hash TEXT, is_admin BOOLEAN DEFAULT FALSE,
|
||||
display_name TEXT, avatar_path TEXT, instagram_url TEXT, profile_visibility TEXT DEFAULT 'public',
|
||||
password_hash TEXT, is_admin BOOLEAN DEFAULT FALSE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
|
||||
CREATE TABLE sessions(id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
token_hash TEXT UNIQUE, expires_at TIMESTAMP);
|
||||
CREATE TABLE friendships(addressee_id INTEGER, status TEXT);
|
||||
CREATE TABLE friendships(id SERIAL PRIMARY KEY, requester_id INTEGER, addressee_id INTEGER, status TEXT);
|
||||
CREATE TABLE direct_messages(recipient_id INTEGER, read_at TIMESTAMP);
|
||||
CREATE TABLE event_invitations(user_id INTEGER, viewed_at TIMESTAMP);
|
||||
CREATE TABLE event_invitations(concert_id INTEGER, user_id INTEGER, viewed_at TIMESTAMP);
|
||||
CREATE TABLE user_blocks(blocker_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
blocked_id INTEGER REFERENCES users(id) ON DELETE CASCADE, PRIMARY KEY(blocker_id,blocked_id));
|
||||
CREATE TABLE venues(id SERIAL PRIMARY KEY, name TEXT, city TEXT);
|
||||
CREATE TABLE concerts(id SERIAL PRIMARY KEY, artist TEXT, start_datetime TIMESTAMP,
|
||||
end_datetime TIMESTAMP, venue_id INTEGER REFERENCES venues(id), visibility TEXT,
|
||||
created_by INTEGER, event_type TEXT DEFAULT 'concert');
|
||||
CREATE TABLE concert_bands(concert_id INTEGER, band_key TEXT, display_name TEXT, position SMALLINT DEFAULT 0);
|
||||
CREATE TABLE concert_attendance(concert_id INTEGER, user_id INTEGER, status TEXT);
|
||||
CREATE TABLE followed_bands(user_id INTEGER, band_key TEXT, display_name TEXT);
|
||||
CREATE TABLE followed_venues(user_id INTEGER, venue_id INTEGER);
|
||||
CREATE TABLE user_badges(user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
badge_code TEXT, awarded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
badge_code TEXT, awarded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, trigger_concert_id INTEGER,
|
||||
PRIMARY KEY(user_id,badge_code));
|
||||
''')
|
||||
for statement in FEATURE_SCHEMA: db.execute(statement)
|
||||
@@ -83,10 +94,60 @@ class FeatureApiTests(unittest.TestCase):
|
||||
def count_devices(self):
|
||||
with main.get_db_connection() as db: return db.execute('SELECT count(*) FROM push_devices').fetchone()[0]
|
||||
|
||||
def test_follow_user_and_show_their_attending_events(self):
|
||||
with main.get_db_connection() as db:
|
||||
db.execute("INSERT INTO concerts(artist,start_datetime,visibility,created_by,event_type) "
|
||||
"VALUES ('Followed Friend Band',CURRENT_TIMESTAMP + INTERVAL '3 days','public',2,'concert')")
|
||||
db.execute("INSERT INTO concert_attendance(concert_id,user_id,status) VALUES (1,2,'attending')")
|
||||
result = self.client.post('/users/tester_b/follow', follow_redirects=False)
|
||||
self.assertEqual(result.status_code, 303)
|
||||
self.client.post('/users/tester_b/follow', follow_redirects=False)
|
||||
with main.get_db_connection() as db:
|
||||
self.assertEqual(db.execute('SELECT count(*) FROM followed_users').fetchone()[0], 1)
|
||||
page = self.client.get('/following')
|
||||
self.assertEqual(page.status_code, 200)
|
||||
self.assertIn('tester_b', page.text)
|
||||
self.assertIn('Followed Friend Band', page.text)
|
||||
self.assertIn('Gehen hin:', page.text)
|
||||
self.client.get('/language/en', follow_redirects=False)
|
||||
english_page = self.client.get('/following')
|
||||
self.assertIn('People', english_page.text)
|
||||
self.assertIn('Going:', english_page.text)
|
||||
with main.get_db_connection() as db:
|
||||
db.execute("UPDATE users SET profile_visibility='friends' WHERE id=2")
|
||||
hidden_attendance = self.client.get('/following')
|
||||
self.assertNotIn('Going: tester_b', hidden_attendance.text)
|
||||
with main.get_db_connection() as db:
|
||||
db.execute("UPDATE users SET profile_visibility='public' WHERE id=2")
|
||||
db.execute("UPDATE concerts SET visibility='private' WHERE id=1")
|
||||
hidden_event = self.client.get('/following')
|
||||
self.assertNotIn('Followed Friend Band', hidden_event.text)
|
||||
|
||||
def test_follow_privacy_self_unfollow_and_block_cleanup(self):
|
||||
with main.get_db_connection() as db:
|
||||
db.execute("UPDATE users SET profile_visibility='nobody' WHERE username='tester_b'")
|
||||
denied = self.client.post('/users/tester_b/follow', follow_redirects=False)
|
||||
self.assertEqual(denied.status_code, 403)
|
||||
self.assertEqual(self.client.post('/users/tester_a/follow', follow_redirects=False).status_code, 400)
|
||||
with main.get_db_connection() as db:
|
||||
db.execute("UPDATE users SET profile_visibility='public' WHERE username='tester_b'")
|
||||
self.client.post('/users/tester_b/follow', follow_redirects=False)
|
||||
removed = self.client.post('/following/users/remove', data={'followed_id':2}, follow_redirects=False)
|
||||
self.assertEqual(removed.status_code, 303)
|
||||
self.client.post('/users/tester_b/follow', follow_redirects=False)
|
||||
self.client.post('/users/tester_b/block', follow_redirects=False)
|
||||
with main.get_db_connection() as db:
|
||||
self.assertEqual(db.execute('SELECT count(*) FROM followed_users').fetchone()[0], 0)
|
||||
|
||||
def test_following_page_requires_login(self):
|
||||
self.client.post('/logout', follow_redirects=False)
|
||||
self.assertEqual(self.client.get('/following', follow_redirects=False).status_code, 303)
|
||||
|
||||
def test_migrations_repeat_and_match_startup_schema(self):
|
||||
with main.get_db_connection() as db:
|
||||
for name, runtime in zip(('19_push_devices.sql', '20_bug_report_submissions.sql',
|
||||
'21_push_notifications.sql', '22_registration_badges.sql'), FEATURE_SCHEMA):
|
||||
'21_push_notifications.sql', '22_registration_badges.sql',
|
||||
'23_followed_users.sql'), FEATURE_SCHEMA):
|
||||
source = Path('/test-migrations', name).read_text()
|
||||
normalize = lambda s: re.sub(r'\s+', '', re.sub(r'--[^\n]*', '', s))
|
||||
self.assertEqual(normalize(source), normalize(runtime))
|
||||
|
||||
Reference in New Issue
Block a user