def setUp(self) -> None: with app.app_context(): # Create an user with no stories q = db.session.query(User).filter(User.email == '*****@*****.**') user = q.first() if user is None: example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() # Create another user q = db.session.query(User).filter(User.email == '*****@*****.**') user = q.first() if user is None: example = User() example.firstname = 'Admin2' example.lastname = 'Admin2' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() # Create a not recent story by Admin2 example = Story() example.text = 'This is a story about the end of the world' example.date = datetime.datetime.strptime('2012-12-12', '%Y-%m-%d') example.author_id = 2 example.figures = 'story#world' example.is_draft = False db.session.add(example) db.session.commit() # Create a recent story saved as draft by Admin2 example = Story() example.text = 'This story is just a draft' example.date = datetime.datetime.now() example.author_id = 2 example.figures = 'story#draft' example.is_draft = True db.session.add(example) db.session.commit() # Create a recent story by Admin example = Story() example.text = 'Just another story' example.date = datetime.datetime.now() example.author_id = 1 example.figures = 'dice#example' example.is_draft = False db.session.add(example) db.session.commit()
def test_story_with_unmarked_dislike(client, auth, database, templates, story_actions): # example story and unmarked reaction s = Story() s.text = 'Trial story of example admin user :)' s.likes = 42 s.dislikes = 0 s.author_id = 1 s.dice_set = ['dice1', 'dice2'] s.is_draft = False s.deleted = False database.session.add(s) r = Reaction() r.reactor_id = 1 r.author = s r.reaction_val = -1 r.marked = False database.session.add(r) database.session.commit() # get the story auth.login() reply = story_actions.get_story(1) template_capture = templates[-1] assert reply.status_code == 200 assert template_capture['story'].likes == 42 # check that the unmarked dislike is counted assert template_capture['story'].dislikes == 1 database.session.commit()
def restart_db_tables(db, app): with app.app_context(): db.init_app(app) db.drop_all(app=app) db.create_all(app=app) example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() example = Story() example.text = 'Trial story of example admin user :)' example.likes = 42 example.author_id = 1 example.roll = { 'dice': ['bike', 'tulip', 'happy', 'cat', 'ladder', 'rain'] } example.date = datetime.datetime(2019, 11, 5) db.session.add(example) db.session.commit()
def test_random_recent_story(self): # Random recent story as anonymous user self.client.get('/stories/random', follow_redirects=True) self.assert_template_used('story.html') self.assertEqual(self.get_context_variable('story').text, 'Just another story') # Login as Admin payload = {'email': '*****@*****.**', 'password': '******'} form = LoginForm(data=payload) self.client.post('/users/login', data=form.data, follow_redirects=True) # No recent stories self.client.get('/stories/random', follow_redirects=True) self.assert_template_used('stories.html') self.assert_message_flashed('Oops, there are no recent stories by other users!') # Create a new recent story by Admin2 example = Story() example.text = 'This is a valid recent story' example.date = datetime.datetime.now() example.author_id = 2 example.figures = 'story#recent' example.is_draft = False db.session.add(example) db.session.commit() # Get the only recent story not written by Admin response = self.client.get('/stories/random', follow_redirects=True) self.assert_template_used('story.html') self.assertEqual(self.get_context_variable('story').text, 'This is a valid recent story')
def test_getuser(client, auth, database, templates): reply = auth.login() assert reply.status_code == 302 reply = client.get('/users/2') assert reply.status_code == 200 user = templates[-1]['user'] stories = templates[-1]['stories'] assert user == 'test1' assert stories == [] example = Story() example.text = 'First story of test1 user :)' example.author_id = 2 example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) database.session.commit() reply = client.get('/users/2') assert reply.status_code == 200 user = templates[-1]['user'] stories = templates[-1]['stories'] assert user == 'test1' assert len(stories) == 1 assert stories[0].id == example.id
def setUp(self) -> None: with app.app_context(): # user for login example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() # reacted story test_story = Story() test_story.text = "Test story from admin user" test_story.author_id = 1 test_story.is_draft = 0 test_story.figures = "#Test#admin#" db.session.add(test_story) db.session.commit() # login payload = {'email': '*****@*****.**', 'password': '******'} form = LoginForm(data=payload) self.client.post('/users/login', data=form.data, follow_redirects=True)
def make_story(userid, text="test text", likes=0, dislikes=0): example = Story() example.text = text example.likes = likes example.dislikes = dislikes example.author_id = userid return example
def test_get_story(client, auth, database, templates, story_actions): example = Story() example.text = 'Trial story of example admin user :)' example.likes = 42 example.author_id = 1 example.dice_set = ['dice1', 'dice2'] database.session.add(example) database.session.commit() auth.login() # story found reply = story_actions.get_story(1) template_capture = templates[-1] assert reply.status_code == 200 assert template_capture['story'].id == 1 # assert template_capture['message'] == '' # story not found reply = story_actions.get_story(0) assert reply.status_code == 404 # invalid input reply = story_actions.get_story('ciao') assert reply.status_code == 404 # deleted story reply = story_actions.delete_story(1) assert reply.status_code == 200 reply = story_actions.get_story(1) assert reply.status_code == 410
def new_stories(): if request.method == 'GET': dice_themes = retrieve_themes() return render_template("new_story.html", themes=dice_themes) else: stry = Story.query.filter(Story.author_id == current_user.id).filter( Story.published == 0).filter( Story.theme == request.form["theme"]).first() if stry != None: return redirect("/write_story/" + str(stry.id), code=302) dice_set = retrieve_dice_set(request.form["theme"]) face_set = dice_set.throw()[:int(request.form["dice_number"])] new_story = Story() new_story.author_id = current_user.id new_story.theme = request.form["theme"] new_story.rolls_outcome = json.dumps(face_set) db.session.add(new_story) db.session.flush() db.session.commit() db.session.refresh(new_story) return redirect('/write_story/' + str(new_story.id), code=302)
def create_app(debug=False): app = Flask(__name__) app.config['WTF_CSRF_SECRET_KEY'] = 'A SECRET KEY' app.config['SECRET_KEY'] = 'ANOTHER ONE' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///storytellers.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # DEBUGGING AND TESTING app.config['SQLALCHEMY_ECHO'] = False app.config['TESTING'] = debug app.config['LOGIN_DISABLED'] = True app.config['WTF_CSRF_ENABLED'] = False for bp in blueprints: app.register_blueprint(bp) bp.app = app db.init_app(app) login_manager.init_app(app) db.create_all(app=app) # create a first admin user with app.app_context(): q = db.session.query(User).filter(User.email == '*****@*****.**') user = q.first() if user is None: example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() q = db.session.query(Story).filter(Story.id == 1) story = q.first() if story is None: example = Story() example.text = 'Trial story of example admin user :)' example.likes = 42 example.author_id = 1 example.dicenumber = 6 example.roll = { 'dice': ['bike', 'tulip', 'happy', 'cat', 'ladder', 'rain'] } example.date = datetime.datetime(2019, 11, 5) db.session.add(example) db.session.commit() return app
def test_story_digest_format(): u = User() u.username = '******' u.email = '*****@*****.**' u.firstname = 'Firstname' u.lastname = 'Lastname' date = dt.datetime.now() s = Story() s.author = u s.text = 'Lorem ipsum dolor sit amet' s.date = date s.likes = 42 s.dislikes = 69 s.dice_set = ['lorem', 'ipsum', 'dolor', 'sit', 'amet'] s.deleted = False s.is_draft = False lines = digests.story_digest(s).split('\n') assert lines[0] == 'author: Firstname Lastname (Username)' assert lines[1] == 'roll: lorem, ipsum, dolor, sit, amet' assert lines[2] == f'date: {date}' assert lines[3] == 'story: Lorem ipsum dolor sit amet' assert lines[4] == 'likes: 42 -- dislikes: 69'
def create_app(): app = Flask(__name__) app.config['WTF_CSRF_SECRET_KEY'] = 'A SECRET KEY' app.config['SECRET_KEY'] = 'ANOTHER ONE' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///storytellers.db' for bp in blueprints: app.register_blueprint(bp) bp.app = app db.init_app(app) login_manager.init_app(app) db.create_all(app=app) # create a first admin user with app.app_context(): q = db.session.query(User).filter(User.email == '*****@*****.**') user = q.first() if user is None: example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() q = db.session.query(Story).filter(Story.id == 1) story = q.first() if story is None: example = Story() example.text = 'Trial story of example admin user :)' example.likes = 42 example.author_id = 1 print(example) db.session.add(example) db.session.commit() return app
def _rollDice(): ''' Rolls the dice and enables the user to start writing a story. The story is created as a draft, so that it can be edited. Raises: Exception: due to eventual failures during the commit of the created story into the database. Returns: 302 -> the user is redirected to the page in which he/she can start writing the story on the faces which came out. ''' diceset = request.args.get('diceset', 'standard') dicenum = request.args.get('dicenum', 6, type=int) try: dice = DiceSet(diceset, dicenum) roll = dice.throw_dice() story = Story() story.text = '' story.theme = diceset story.likes = 0 story.dislikes = 0 story.dice_set = roll story.author_id = current_user.id db.session.add(story) db.session.commit() except Exception as e: print(e) db.session.rollback() abort(400) return redirect(url_for('stories._story_edit', storyid=story.id))
def test_statistics(client, auth, database, templates): auth.login() reply = client.get('/') assert reply.status_code == 200 # As soon as I create a new user I shouldn't have stats # since I have no stories stats = templates[-1]['stats'] assert stats == {} example = Story() example.text = 'Lorem ipsum dolor sit amet' example.likes = 0 example.dislikes = 0 example.author_id = 1 example.dice_set = ["face1", "face2", "face3", "face4"] database.session.add(example) database.session.commit() reply = client.get('/') stats = templates[-1]['stats'] assert reply.status_code == 200 # List index 0 refers to number of stories, # index 1 refers to the number of likes, # index 2 to the number of dislikes assert stats['stories'][0] == 1 \ and stats['stories'][1] == 0 \ and stats['stories'][2] == 0 # I threw one set of four dice only once assert stats['avg_dice'] == 4 # Published only only one story assert stats['stories_frequency'] == 1 # Active user, it has been published at least one story in the last 7 days assert stats['active']
def setUp(self) -> None: with app.app_context(): # user for login example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() # reacted story test_story = Story() test_story.text = "Test story from admin user" test_story.author_id = 1 test_story.is_draft = 0 test_story.figures = "#admin#cat#" db.session.add(test_story) db.session.commit()
def test_die_init(self): example = User() example.id = random.randint(0, 2048) example.firstname = 'userwall' example.lastname = 'theWall' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('daddysflownacrosstheocean') some_stories = [ 'story1', 'story2', 'story3', 'story4', 'story5', 'story6' ] wall = Wall(example) for s in some_stories: story = Story() story.id = random.randint(0, 2048) story.text = s story.likes = 0 story.dislikes = 0 wall.add_story(story) wall.storyLimit = len(wall.stories) story = Story() story.id = random.randint(0, 2048) story.text = 'an extra story' story.likes = 0 story.dislikes = 0 wall.add_story(story) wall.add_story(story) self.assertEqual(len(wall.stories), wall.storyLimit)
def test_get_random_recent_story_1(client, database, templates, story_actions): example = Story() example.text = 'recent story' example.likes = 0 example.author_id = 1 example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) example = Story() example.text = 'old story (months/years ago)' example.likes = 0 example.author_id = 1 example.date = dt.datetime(2019, 9, 5) example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) example = Story() example.text = 'not recent story (yesterday)' example.date = dt.datetime.now() - dt.timedelta(days=1) example.likes = 0 example.author_id = 2 example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) database.session.commit() # story found reply = story_actions.get_random_recent_story() assert reply.status_code == 200 template_context = templates[-1] assert template_context['story'].id == 1 assert template_context['message'] == ''
def test_check_mywall(client, auth, database, templates): reply = client.get('/') assert reply.status_code == 302 auth.login() reply = client.get('/') stories = templates[-1]['stories'] assert reply.status_code == 200 assert stories == [] example = Story() # gets story_id=1 as user_id or as the first? example.text = 'Trial story of example admin user :)' example.likes = 42 example.dislikes = 0 example.author_id = 1 example.dice_set = 'face1?face2?face3?face4' database.session.add(example) database.session.commit() reply = client.get('/') stories = templates[-1]['stories'] assert reply.status_code == 200 assert len(stories) == 1 assert stories[0].id == example.id example2 = Story() # gets story_id=1 as user_id or as the first? example2.text = 'New story of example admin user :)' example2.likes = 42 example2.dislikes = 0 example2.author_id = 1 example2.dice_set = 'face1?face2?face3?face4' database.session.add(example2) database.session.commit() reply = client.get('/') stories = templates[-1]['stories'] assert reply.status_code == 200 assert len(stories) == 2 for story in stories: assert story.id == example.id or story.id == example2.id
def test_get_by_interest(client, auth, database, templates, story_actions): auth.login() example1 = Story() example1.theme = 'halloween' example1.text = 'Halloween story of test1 user :)' example1.author_id = 2 example1.is_draft = False example1.deleted = False example1.dice_set = ['a', 'b', 'c'] database.session.add(example1) database.session.commit() example2 = Story() example2.theme = 'xmas' example2.text = 'Xmas story of test2 user :)' example2.author_id = 3 example2.is_draft = False example2.deleted = False example2.dice_set = ['a', 'b', 'c'] database.session.add(example2) database.session.commit() example3 = Story() example3.theme = 'xmas' example3.theme = 'Old xmas story of test3 user :)' example3.date = dt.datetime.now() - dt.timedelta(days=6) example3.author_id = 4 example3.is_draft = False example3.deleted = False example3.dice_set = ['a', 'b', 'c'] database.session.add(example3) database.session.commit() reply = story_actions.get_all_stories(theme='xmas') assert reply.status_code == 200 assert templates[-1]['stories'].all() == [example2]
def test1(self): global _app tested_app = create_app(debug=True) _app = tested_app with tested_app.test_client() as client: with client.session_transaction() as sess: db.drop_all() db.create_all() # create user user_a = User() user_a.email = '*****@*****.**' user_a.set_password('test') db.session.add(user_a) db.session.commit() user_b = User() user_b.email = '*****@*****.**' user_b.set_password('test') db.session.add(user_b) db.session.commit() # create story story = Story() story.text = 'Text a' story.likes = 0 story.dislikes = 0 story.author_id = user_a.get_id() story.roll = { 'dice': ['bike', 'tulip', 'happy', 'cat', 'ladder', 'rain'] } db.session.add(story) db.session.commit() # add like like = Reaction() like.marked = 0 like.story_id = story.id like.user_id = user_b.id like.type = 1 db.session.add(story) db.session.commit() # create 1000 user and like the story users = [] for i in range(10): user = User() user.email = 'user' + str(i) + '@test.com' user.set_password('test') db.session.add(user) users.append(user) db.session.add(story) db.session.commit() for u in users: add_reaction(u.id, 1, 1) # # reaction = Reaction.query.count() # print(str(reaction))) res = update_reactions.apply_async(args=[1], time_limit=3) res.get() q = Story.query.filter_by(author_id=1).first() self.assertEqual(int(q.likes), 10)
def create_app(test=False): app = Flask(__name__, static_url_path='/static') app.config['WTF_CSRF_SECRET_KEY'] = 'A SECRET KEY' app.config['SECRET_KEY'] = 'ANOTHER ONE' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///storytellers.db' if test: app.config['TESTING'] = True app.config['CELERY_ALWAYS_EAGER'] = True app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:' app.config['WTF_CSRF_ENABLED'] = False app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False celery = celeryApp.make_celery(app) celeryApp.celery = celery for bp in blueprints: app.register_blueprint(bp) bp.app = app db.init_app(app) login_manager.init_app(app) db.create_all(app=app) with app.app_context(): # Create first admin user. q = db.session.query(User).filter(User.email == '*****@*****.**') user = q.first() if user is None: example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) db.session.commit() example = Story() example.title = 'My first story!' example.rolls_outcome = '[["bike", "static/Mountain/bike.PNG"], ["bus", "static/Mountain/bus.PNG"]]' example.text = 'With my bike, I am faster than a bus!!!!' example.theme = 'Mountain' example.published = 1 example.likes = 42 example.dislikes = 5 example.author_id = 1 db.session.add(example) db.session.commit() # Create dice sets if missing. themes = retrieve_themes() if not themes: die1 = Die( ['angry', 'bag', 'bike', 'bird', 'crying', 'moonandstars'], "N/A") die2 = Die(['bus', 'coffee', 'happy', 'letter', 'paws', 'plate'], "N/A") die3 = Die( ['caravan', 'clock', 'drink', 'mouth', 'tulip', 'whale'], "N/A") die4 = Die( ['baloon', 'bananas', 'cat', 'icecream', 'pencil', 'phone'], "N/A") dice_set = DiceSet([die1, die2, die3], "Mountain") store_dice_set(dice_set) dice_set = DiceSet([die2, die3, die4], "Late night") store_dice_set(dice_set) dice_set = DiceSet([die3, die1, die4], "Travelers") store_dice_set(dice_set) dice_set = DiceSet([die2, die1, die4], "Youth") store_dice_set(dice_set) die = Die(["1", "2", "3"], "test_theme") dice_set = DiceSet([die], "test_theme") return app
def test_user_digest_format(client, database): now = dt.datetime.now() s1 = Story(author_id=2, text='Story 1', likes=42, dislikes=69, is_draft=False, deleted=False) s1.dice_set = ['dice', 'set'] s1.date = now - dt.timedelta(days=1) database.session.add(s1) s2 = Story(author_id=2, text='Story 2', date=now, likes=42, dislikes=69, is_draft=False, deleted=False) s2.dice_set = ['dice', 'set'] s2.date = now database.session.add(s2) s3 = Story(author_id=2, text='Story 3', likes=42, dislikes=69, is_draft=False, deleted=False) s3.dice_set = ['dice', 'set'] s3.date = now - dt.timedelta(days=7) database.session.add(s3) s4 = Story(author_id=3, text='Story 4', likes=42, dislikes=69, is_draft=False, deleted=False) s4.dice_set = ['dice', 'set'] s4.date = now database.session.add(s4) s5 = Story(author_id=2, text='Story 5', likes=42, dislikes=69, is_draft=True, deleted=False) s5.dice_set = ['dice', 'set'] s5.date = now database.session.add(s5) s6 = Story(author_id=2, text='Story 5', likes=42, dislikes=69, is_draft=False, deleted=True) s6.dice_set = ['dice', 'set'] s6.date = now database.session.add(s6) u = User.query.get(1) u.follows.append(User.query.get(2)) database.session.commit() digest = digests.build_user_digest(u, now - dt.timedelta(days=2), now + dt.timedelta(days=2)) \ .get_content().split('----------\n') assert len(digest) == 2 assert digest[0] == digests.story_digest(s2) assert digest[1] == digests.story_digest(s1)
def setUp(self) -> None: print("SET UP") with app.app_context(): # Add Admin user example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) # Add another user for testing example = User() example.firstname = 'Test' example.lastname = 'Man' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 6) example.is_admin = False example.set_password('test') db.session.add(example) # Add some stories for user 1 example = Story() example.text = 'Trial story of example admin user :)' example.author_id = 1 example.figures = '#example#admin#' example.is_draft = False db.session.add(example) db.session.commit() example = Story() example.text = 'Another story!' example.author_id = 1 example.is_draft = True example.figures = '#another#story#' db.session.add(example) db.session.commit() # Add reactions for user 1 like = Counter() like.reaction_type_id = 1 like.story_id = 1 like.counter = 23 dislike = Counter() dislike.reaction_type_id = 2 dislike.story_id = 1 dislike.counter = 5 db.session.add(like) db.session.add(dislike) db.session.commit() # login payload = {'email': '*****@*****.**', 'password': '******'} form = LoginForm(data=payload) self.client.post('/users/login', data=form.data, follow_redirects=True)
def test_digest_task(client, database, smtp_server): # Here because it requires the app context to be set from monolith.task import send_digest no_stories = 'Start following your favourite users to get ' \ 'periodic digests.' send_digest.apply() for msg in smtp_server.messages: assert msg.get_payload() == no_stories now = dt.datetime.now() s1 = Story(author_id=2, text='Story 1', likes=42, dislikes=69, is_draft=False, deleted=False) s1.dice_set = ['dice', 'set'] s1.date = now - dt.timedelta(days=1) database.session.add(s1) s2 = Story(author_id=2, text='Story 2', likes=42, dislikes=69, is_draft=False, deleted=False) s2.dice_set = ['dice', 'set'] s2.date = now - dt.timedelta(days=60) database.session.add(s2) s3 = Story(author_id=3, text='Story 3', likes=42, dislikes=69, is_draft=False, deleted=False) s3.dice_set = ['dice', 'set'] s3.date = now - dt.timedelta(days=4) database.session.add(s3) u1 = User.query.get(1) u2 = User.query.get(2) u3 = User.query.get(3) u4 = User.query.get(4) u1.follows.append(u2) u2.follows.append(u3) u3.follows.append(u4) database.session.commit() smtp_server.reset() send_digest.apply() for msg in smtp_server.messages: u = User.query.filter_by(email=msg['To']).one() digest = digests.build_user_digest(u, now - dt.timedelta(weeks=4), now) payload = msg.get_payload().replace('\r\n', '\n').strip() digest = digest.get_payload().replace('\r\n', '\n').strip() assert payload == digest
def _stories(message='', error=False, res_msg='', info_bar=False): form = SelectDiceSetForm() if 'POST' == request.method: # Create a new story new_story = Story() new_story.author_id = current_user.id new_story.likes = 0 new_story.dislikes = 0 if form.validate_on_submit(): text = request.form.get('text') roll = request.form.get('roll') # for the tests if re.search('"', roll): roll = json.loads(request.form.get('roll')) if (type(roll) is str): roll = roll.replace("[", "") roll = roll.replace("]", "") roll = roll.replace("'", "") roll = roll.replace(" ", "") aux = roll.split(",") roll = aux dicenumber = len(roll) try: check_storyV2(text, roll) new_story.text = text new_story.roll = {'dice': roll} new_story.dicenumber = dicenumber db.session.add(new_story) db.session.commit() except WrongFormatStoryError: # print('ERROR 1', file=sys.stderr) message = "There was an error. Try again." except WrongFormatDiceError: # print('ERROR 2', file=sys.stderr) message = "There was an error. Try again." except TooLongStoryError: # print('ERROR 3', file=sys.stderr) message = "The story is too long. The length is > 1000 characters." except TooSmallStoryError: # print('ERROR 4', file=sys.stderr) message = "The number of words of the story must greater or equal of the number of resulted faces." except WrongFormatSingleDiceError: # print('ERROR 5', file=sys.stderr) message = "There was an error. Try again." except InvalidStory: # print('ERROR 6', file=sys.stderr) message = "Invalid story. Try again!" allstories = db.session.query(Story, User).join(User).all() allstories = list( map( lambda x: (x[0], x[1], "hidden" if x[1].id == current_user.id else "", "unfollow" if _is_follower(current_user.id, x[1].id) else "follow", reacted(current_user.id, x[0].id)), allstories)) return render_template("stories.html", message=message, form=form, stories=allstories, active_button="stories", like_it_url="/stories/reaction", details_url="/stories", error=error, info_bar=info_bar, res_msg=str(res_msg)) elif 'GET' == request.method: allstories = db.session.query(Story, User).join(User).all() allstories = list( map( lambda x: (x[0], x[1], "hidden" if x[1].id == current_user.id else "", "unfollow" if _is_follower(current_user.id, x[1].id) else "follow", reacted(current_user.id, x[0].id)), allstories)) return render_template("stories.html", message=message, form=form, stories=allstories, active_button="stories", like_it_url="/stories/reaction", details_url="/stories", error=error, info_bar=info_bar, res_msg=str(res_msg))
def test_getusers(client, database, auth, templates): reply = auth.login('Admin', 'admin') assert reply.status_code == 302 reply = client.get('/users') template_capture = templates[-1]['result'] users = [(r[0], r[1]) for r in template_capture] assert users == [('Admin', None), ('test1', None), ('test2', None), ('test3', None)] example = Story() example.text = 'First story of admin user :)' example.author_id = 1 example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) database.session.commit() reply = client.get('/users') template_capture = templates[-1]['result'] users = [(r[0], r[1]) for r in template_capture] assert users == [('Admin', 'First story of admin user :)'), ('test1', None), ('test2', None), ('test3', None)] client.get('/logout') client.post('/signup', data={'email': '*****@*****.**', 'username': '******', 'password': '******'}) reply = client.get('/users') template_capture = templates[-1]['result'] users = [(r[0], r[1]) for r in template_capture] assert users == [('Admin', 'First story of admin user :)'), ('test1', None), ('test2', None), ('test3', None), ('prova', None)] example = Story() example.text = 'First story of prova user :)' example.author_id = 5 example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) database.session.commit() reply = client.get('/users') template_capture = templates[-1]['result'] users = [(r[0], r[1]) for r in template_capture] assert users == [('Admin', 'First story of admin user :)'), ('test1', None), ('test2', None), ('test3', None), ('prova', 'First story of prova user :)')] example = Story() example.text = 'Second story of admin user :)' example.author_id = 1 example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) database.session.commit() reply = client.get('/users') template_capture = templates[-1]['result'] users = [(r[0], r[1]) for r in template_capture] assert users == [('Admin', 'Second story of admin user :)'), ('test1', None), ('test2', None), ('test3', None), ('prova', 'First story of prova user :)')]
def test_json_wall(self): app = test_app.test_client() with app.session_transaction() as sess: db.drop_all() db.create_all() q = db.session.query(User).filter(User.email == '*****@*****.**') user = q.first() if user is None: example = User() example.firstname = 'userwall' example.lastname = 'theWall' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('daddysflownacrosstheocean') db.session.add(example) db.session.commit() q = db.session.query(User).filter(User.email == '*****@*****.**') user = q.first() q = db.session.query(Story).filter(Story.author_id == user.id) story = q.first() if story is None: example = Story() example.text = 'We dont need no education We dont need no...All in all you re just another brick in the wall' example.likes = 42 example.dislikes = 1 example.dicenumber = 6 example.author_id = user.id db.session.add(example) example = Story() example.text = 'Leaving just a memory...Snapshot in the family album...Daddy what else did you leave for me?' example.likes = 42 example.dislikes = 0 example.dicenumber = 4 example.author_id = user.id db.session.add(example) db.session.commit() q = db.session.query(Story).filter(Story.author_id == user.id) stories = [] thewalltest = Wall(user) for s in q: s: Story thewalltest.add_story(s) stories.append({ 'story_id': s.id, 'text': s.text, 'likes': s.likes, 'dislikes': s.dislikes }) reply = app.get('/thewall/' + str(user.id)) body = json.loads(str(reply.data, 'utf8')) self.assertEqual( body, { "id": user.id, "firstname": user.firstname, "lastname": user.lastname, "email": user.email, "stories": stories # thewalltest.stories }) wall_repl = Wall() wall_repl.acquire_from_json(reply) self.assertEqual(thewalltest.id, wall_repl.id, "Json acquire fail")
def _write_story(id_story=None, message='', status=200): form = StoryForm() # Setting session to modify draft if 'GET' == request.method and id_story is not None: story = Story.query.filter(Story.id == id_story).first() if story is not None and story.author_id == current_user.id and story.is_draft: form.text.data = story.text session['figures'] = story.figures.split('#') session['figures'] = session['figures'][1:-1] session['id_story'] = story.id else: flash( 'Request is invalid, check if you are the author of the story and it is still a draft', 'error') return redirect( url_for('users._user_drafts', id_user=current_user.id)) # Check if there are the words to write the story if 'figures' not in session: flash('Request is invalid, you need to set a story before', 'error') return redirect(url_for('home.index')) elif 'POST' == request.method: if form.validate_on_submit(): draft = bool(int(form.as_draft.data)) if draft: if 'id_story' in session: # Update a draft db.session.query(Story).filter_by( id=session['id_story']).update({ 'text': form.text.data, 'date': datetime.datetime.now() }) db.session.commit() session.pop('id_story') else: # Save new story as draft new_story = Story() new_story.author_id = current_user.id new_story.figures = '#' + '#'.join( session['figures']) + '#' new_story.is_draft = True form.populate_obj(new_story) db.session.add(new_story) db.session.commit() session.pop('figures') return redirect( url_for('users._user_drafts', id_user=current_user.id)) else: # Check validity dice_figures = session['figures'].copy() trans = str.maketrans(string.punctuation, ' ' * len(string.punctuation)) new_s = form['text'].data.translate(trans).lower() story_words = new_s.split() for w in story_words: if w in dice_figures: dice_figures.remove(w) if not dice_figures: break if len(dice_figures) > 0: status = 400 message = 'Your story doesn\'t contain all the words. Missing: ' for w in dice_figures: message += w + ' ' else: if 'id_story' in session: # Publish a draft date_format = "%Y %m %d %H:%M" date = datetime.datetime.strptime( datetime.datetime.now().strftime(date_format), date_format) db.session.query(Story).filter_by( id=session['id_story']).update({ 'text': form.text.data, 'date': date, 'is_draft': False }) db.session.commit() session.pop('id_story') else: # Publish a new story new_story = Story() new_story.author_id = current_user.id new_story.figures = '#' + '#'.join( session['figures']) + '#' new_story.is_draft = False form.populate_obj(new_story) db.session.add(new_story) db.session.commit() session.pop('figures') flash('Your story is a valid one! It has been published') return redirect( url_for('users._user_stories', id_user=current_user.id, _external=True)) return make_response( render_template("write_story.html", home_url=HOME_URL, form=form, words=session['figures'], message=message), status)
def init_database(database): example = Story() example.text = 'lorem ipsum dolor sit amet' example.likes = 42 example.author_id = 1 example.date = dt.datetime(year=2018, month=12, day=1) example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) example = Story() example.text = 'bird drink coffee baloon' example.likes = 42 example.author_id = 1 example.date = dt.datetime(year=2019, month=1, day=1) example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) example = Story() example.text = 'lorem Coffee dolor sit amet' example.likes = 42 example.author_id = 1 example.date = dt.datetime(year=2019, month=3, day=12) example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) example = Story() example.text = 'bird cofFee baloon amet' example.likes = 42 example.author_id = 1 example.date = dt.datetime(year=2017, month=10, day=1) example.is_draft = False example.deleted = False example.dice_set = ['a', 'b', 'c'] database.session.add(example) database.session.commit()
def setUp(self) -> None: with app.app_context(): # user for login example = User() example.firstname = 'Admin' example.lastname = 'Admin' example.email = '*****@*****.**' example.dateofbirth = datetime.datetime(2020, 10, 5) example.is_admin = True example.set_password('admin') db.session.add(example) # dummy user dummy_user = User() dummy_user.firstname = 'Dummy' dummy_user.lastname = 'Dummy' dummy_user.email = '*****@*****.**' dummy_user.dateofbirth = datetime.datetime(2020, 10, 5) dummy_user.is_admin = True dummy_user.set_password('admin') db.session.add(dummy_user) db.session.commit() dummy_id = User.query.filter( User.email == '*****@*****.**').first().id test_story = Story() test_story.text = "Test story from admin user" test_story.author_id = 1 test_story.is_draft = 0 test_story.figures = "#Test#admin#" dummy_story = Story() dummy_story.text = "Test story from dummy user" dummy_story.author_id = dummy_id dummy_story.is_draft = 0 dummy_story.figures = "#Test#dummy#" db.session.add(test_story) db.session.add(dummy_story) db.session.commit() payload = {'email': '*****@*****.**', 'password': '******'} form = LoginForm(data=payload) self.client.post('/users/login', data=form.data, follow_redirects=True)