Example #1
0
    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()
Example #2
0
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()
Example #3
0
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()
Example #4
0
    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')
Example #5
0
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
Example #6
0
    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)
Example #7
0
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
Example #8
0
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
Example #9
0
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)
Example #10
0
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
Example #11
0
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'
Example #12
0
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
Example #13
0
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))
Example #14
0
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']
Example #15
0
    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()
Example #16
0
    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)
Example #17
0
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'] == ''
Example #18
0
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
Example #19
0
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]
Example #20
0
    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)
Example #21
0
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
Example #22
0
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)
Example #23
0
    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)
Example #24
0
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
Example #25
0
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))
Example #26
0
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 :)')]
Example #27
0
    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")
Example #28
0
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)
Example #29
0
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)