Skip to content

Commit

Permalink
Merge branch 'master' into enhancement/sumukh/backup-link
Browse files Browse the repository at this point in the history
* master:
  turn off debug mode in tests and stop printing in test
  tweak coverage settings, remove client_secrets sample
  Fix coverage bug for selenium tests
  add browser testing for student/group routes
  delete exceptions.py, not used anywhere
  • Loading branch information
sumukh1@gmail.com committed Jul 22, 2016
2 parents 506b671 + dd4f535 commit b4a712b
Show file tree
Hide file tree
Showing 13 changed files with 114 additions and 64 deletions.
5 changes: 2 additions & 3 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@
branch = True
include = server/*
omit =
*__init__.py
*static*
*templates*
# GCS API wrapper
*cloudstorage*
*generate.py

[report]
# Regexes for lines to exclude from consideration
Expand All @@ -20,6 +18,7 @@ exclude_lines =
# Don't complain if tests don't hit defensive assertion code:
raise AssertionError
raise NotImplementedError
raise ValueError
pass

# Don't complain if non-runnable code isn't run:
Expand Down
1 change: 1 addition & 0 deletions server/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ def not_found_error(error):
app.jinja_env.globals.update({
'utils': utils,
'debug': app.debug,
'instantclick': app.config.get('INSTANTCLICK', True),
'CSRFForm': CSRFForm
})

Expand Down
14 changes: 0 additions & 14 deletions server/client_secrets.sample

This file was deleted.

26 changes: 0 additions & 26 deletions server/exceptions.py

This file was deleted.

1 change: 1 addition & 0 deletions server/settings/dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
ASSETS_DEBUG = True
TESTING_LOGIN = True
DEBUG_TB_INTERCEPT_REDIRECTS = False
INSTANTCLICK = True

SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_DATABASE_URI = 'sqlite:///../oksqlite.db'
Expand Down
1 change: 1 addition & 0 deletions server/settings/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
ASSETS_DEBUG = False
TESTING_LOGIN = True
DEBUG_TB_INTERCEPT_REDIRECTS = False
INSTANTCLICK = False

SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_DATABASE_URI = 'sqlite:///../oktest.db'
Expand Down
7 changes: 3 additions & 4 deletions server/templates/student/assignment/_tablehelper.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ <h2>{{ tname }}</h2>
<input type="hidden" name="flag">
{% endif %}
<input type="hidden" name="next" value="{{ request.full_path }}">
<button class="tip-trigger final-button button-small" {% if not assignment.active %} disabled {% endif %} type="submit">
<button class="flag-button tip-trigger final-button button-small" {% if not assignment.active %} disabled {% endif %} type="submit">
<div class="tip">
{% if not assignment.active %}
<span>Cannot be changed after deadline</span>
Expand All @@ -52,7 +52,7 @@ <h2>{{ tname }}</h2>
</td>

<td>
<a href="{{ url_for('.code', name=assignment.name, bid=subm.id, submit=subm.submit)}}" class="no-dash button-small">
<a href="{{ url_for('.code', name=assignment.name, bid=subm.id, submit=subm.submit)}}" class="view-code no-dash button-small">
View Code
</a>
</td>
Expand Down Expand Up @@ -103,7 +103,7 @@ <h2>{{ tname }}</h2>
{% call forms.render_form(flag_form, action_url=url_for('.flag', name=assignment.name, bid=backup.id), class_='form-inline') %}
<input type="hidden" name="flag">
<input type="hidden" name="next" value="{{ request.full_path }}">
<button class="tip-trigger final-button button-small" {% if not assignment.active %} disabled {% endif %} type="submit">
<button class="convert-button tip-trigger final-button button-small" {% if not assignment.active %} disabled {% endif %} type="submit">
{% if not assignment.active %}
<div class="tip">
<span>Too late to convert submission</span>
Expand All @@ -114,7 +114,6 @@ <h2>{{ tname }}</h2>
</div>
{% endif %}
Convert to submission

</button>
{% endcall %}
</td>
Expand Down
10 changes: 5 additions & 5 deletions server/templates/student/assignment/group_table.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@
{% if member.user == current_user %}
<input class="hidden" class="user-identifier" name="user-identifier" type="hidden" value="yourself">
<input class="hidden" class="form-action" name="email" type="hidden" value="{{ member.user.email }}">
<button class="button-small group-action remove-confirm tip-trigger" type="submit" value="Leave">
<button id="remove-self" class="button-small group-action remove-confirm tip-trigger" type="submit" value="Leave">
Leave <div class="tip"> <span> Remove yourself from the group </span> </div>
</button>

{% else %}
<input class="hidden" class="form-action user-identifier" name="email" type="hidden" value="{{ member.user.email }}">
<button class="button-small group-action remove-confirm tip-trigger" type="submit" value="Remove">
<button id="remove-member" class="button-small group-action remove-confirm tip-trigger" type="submit" value="Remove">
Remove <div class="tip"> <span> {{ member.user.email }} will no longer have access to group submissions. </span> </div>
</button>
{% endif %}
Expand All @@ -40,7 +40,7 @@
<input class="hidden" class="user-identifier" name="user-identifier" type="hidden" value="yourself">
<input class="hidden" class="form-info" name="email" type="hidden" value="{{ member.user.email }}">
<input class="hidden" class="form-action" name="action" type="hidden" value="accept">
<button class="button-small group-action btn-accept tip-trigger" type="submit" value="Accept">
<button class="invite-accept button-small group-action btn-accept tip-trigger" type="submit" value="Accept">
<i class="fa fa-check "></i> Accept <div class="tip"> <span> Join the group </span> </div>
</button>
{% endcall %}
Expand All @@ -51,14 +51,14 @@
{% if member.user == current_user %}
<input class="hidden" class="user-identifier" name="user-identifier" type="hidden" value="yourself">
<input class="hidden" class="form-user" name="email" type="hidden" value="{{ member.user.email }}">
<button class="button-small group-action tip-trigger" type="submit" value="Decline">
<button id="invite-decline" class="button-small group-action tip-trigger" type="submit" value="Decline">
<i class="fa fa-minus-circle "></i> Decline <div class="tip"> <span> Reject the invitation </span> </div>
</button>
<input class="hidden" class="form-action" id="action" name="action" type="hidden" value="decline">

{% else %}
<input class="hidden" class="form-user user-identifier" name="email" type="hidden" value="{{ member.user.email }}">
<button class="button-small group-action tip-trigger" type="submit" value="Revoke">
<button id="invite-revoke" class="button-small group-action tip-trigger" type="submit" value="Revoke">
<i class="fa fa-minus-circle "></i> Revoke <div class="tip"> <span> Undo the invitation. </span> </div>
</button>
<input class="hidden" class="form-action" id="action" name="action" type="hidden" value="revoke">
Expand Down
8 changes: 6 additions & 2 deletions server/templates/student/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,12 @@


{% assets "instant_js" %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
<script data-no-instant>InstantClick.init(50);</script>
{% if instantclick %}
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
<script data-no-instant>InstantClick.init(50);</script>
{% else %}
<!-- InstantClick disabled -->
{% endif %}
{% endassets %}

{% endblock %}
Expand Down
2 changes: 1 addition & 1 deletion server/templates/student/course/index.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{% extends "student/base.html" %}
{% import 'student/course/_assigntable.html' as table %}

{% block title %} Courses | Ok {% endblock %}
{% block title %} {{ course.display_name_with_semester }} | Ok {% endblock %}

{% block header %}

Expand Down
8 changes: 4 additions & 4 deletions server/templates/student/courses/_coursetable.html
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ <h2>{{ tname }}</h2>
<div class="due">
<span>
{% if admin %}
<a href="{{ url_for('admin.course', cid=course.id) }}" data-no-instant>{{course.display_name_with_semester}}</a>
<a class="admin-course" href="{{ url_for('admin.course', cid=course.id) }}" data-no-instant>{{course.display_name_with_semester}}</a>
{% else %}
<a href="{{ url_for('student.course', offering=course.offering) }}">{{course.display_name_with_semester}}</a>
<a class="student-course" href="{{ url_for('student.course', offering=course.offering) }}">{{course.display_name_with_semester}}</a>
{% endif %}
</span>
</div>
Expand Down Expand Up @@ -89,9 +89,9 @@ <h2>{{ tname }}</h2>
<div class="cell col-xs-12">
<div class="cell-title">
{% if admin %}
<a href="{{ url_for('admin.course', cid=course.id) }}" data-no-instant>{{course.display_name_with_semester}}</a>
<a class="admin-course" href="{{ url_for('admin.course', cid=course.id) }}" data-no-instant>{{course.display_name_with_semester}}</a>
{% else %}
<a href="{{ url_for('student.course', offering=course.offering) }}">{{course.display_name_with_semester}}</a>
<a class="student-course" href="{{ url_for('student.course', offering=course.offering) }}">{{course.display_name_with_semester}}</a>
{% endif %}
</div>
<div class="cell-text"><span>{{course.offering}} @ {{course.institution}}</span></div>
Expand Down
2 changes: 1 addition & 1 deletion server/templates/testing-login.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<p class="login-box-msg">Impersonate a specific user</p>
<form action="{{ callback }}" method="post">
<div class="form-group has-feedback">
<input type="text" class="form-control" name="email" placeholder="Email">
<input type="text" class="form-control" name="email" id="email-login" placeholder="Email">
</div>
<div class="row">
<button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button>
Expand Down
93 changes: 89 additions & 4 deletions tests/test_web.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import json
import os
import signal

import requests
from flask_testing import LiveServerTestCase
from selenium import webdriver

from server import create_app
from server import models

from tests import OkTestCase

try:
Expand All @@ -24,6 +28,28 @@ def setUp(self):
OkTestCase.setup_course(self)
self.driver.set_window_size(1268, 1024)

def _seed_course(self):
self.active_user_ids = [self.user1.id, self.user3.id]
# Setup some submissisions
message_dict = {'file_contents': {'backup.py': '1'}, 'analytics': {}}
for i in range(5):
for user_id in self.active_user_ids:
submit = True if i % 2 else False
backup = models.Backup(submitter_id=user_id,
assignment=self.assignment, submit=submit)
messages = [models.Message(kind=k, backup=backup,
contents=m) for k, m in message_dict.items()]
models.db.session.add_all(messages)
models.db.session.add(backup)
models.db.session.commit()

# Setup some groups
models.Group.invite(self.user1, self.user4, self.assignment)
group = models.Group.lookup(self.user1, self.assignment)
group.accept(self.user4)

models.Group.invite(self.user2, self.user3, self.assignment)

def create_app(self):
app = create_app('settings/test.py')
app.config['TESTING'] = True
Expand All @@ -32,6 +58,17 @@ def create_app(self):
# app.config['LIVESERVER_PORT'] = 8943
return app

def _terminate_live_server(self):
""" Properly handle termination for coverage reports.
Works on *nix systems (aka not windows).
https://github.com/jarus/flask-testing/issues/70 """
# Handle Windows
if os.name == "nt":
print("Coverage may not properly be reported on Windows")
return LiveServerTestCase._terminate_live_server(self)
os.kill(self._process.pid, signal.SIGINT)
self._process.join()

def tearDown(self):
OkTestCase.tearDown(self)
super(WebTest, self).tearDown()
Expand All @@ -52,14 +89,24 @@ def pageLoad(self, url):
# Assert no console messages
self.assertEqual([], self.driver.get_log('browser'))

def login(self, role="admin"):
def _login(self, role="admin"):
self.driver.get(self.get_server_url() + "/testing-login/")
# self.driver.get_screenshot_as_file('login.png')
self.assertIn('Login', self.driver.title)

self.driver.find_element_by_id(role).click()
self.assertIn('Courses | Ok', self.driver.title)

def _login_as(self, email=None):
self.driver.get(self.get_server_url() + "/testing-login/")
self.assertIn('Login', self.driver.title)

inputElement = self.driver.find_element_by_id("email-login")
inputElement.send_keys(email)
inputElement.submit()

self.assertIn('Courses | Ok', self.driver.title)

def test_server_is_up_and_running(self):
response = requests.get(self.get_server_url())
self.assertEqual(response.status_code, 200)
Expand All @@ -72,6 +119,11 @@ def test_api_is_up_and_running(self):
self.assertEqual(data['message'], 'success')
self.assertEqual(data['data']['version'], 'v3')

def test_static_pages(self):
about_url = "{}/about/tos".format(self.get_server_url())
self.pageLoad(about_url)
self.assertIn('Ok |', self.driver.title)

def test_phantom_web(self):
self.pageLoad(self.get_server_url())
self.assertIn('Ok', self.driver.title)
Expand All @@ -86,14 +138,47 @@ def test_phantom_web(self):
self.driver.find_element_by_id('logout').click()
self.assertIn('Ok |', self.driver.title)

def test_student_view(self):
self._seed_course()

self._login_as(email=self.user4.email)

self.pageLoad(self.get_server_url())
self.assertIn('Courses | Ok', self.driver.title)

self.pageLoad("{}/cal/cs61a/sp16/".format(self.get_server_url()))
self.assertTrue("Current Assignments" in self.driver.page_source)

self.pageLoad("{}/cal/cs61a/sp16/proj1/".format(self.get_server_url()))

self.driver.find_element_by_class_name("view-code").click()
self.assertTrue("backup.py" in self.driver.page_source)

self.pageLoad("{}/cal/cs61a/sp16/proj1/backups/".format(self.get_server_url()))
self.pageLoad("{}/cal/cs61a/sp16/proj1/submissions/".format(self.get_server_url()))

def test_student_remove_member(self):
self._seed_course()
self._login_as(email=self.user4.email)
self.pageLoad("{}/cal/cs61a/sp16/proj1/".format(self.get_server_url()))
self.assertTrue("student1@aol.com" in self.driver.page_source)

# .click will send a sweet alert warning
self.driver.find_element_by_id("remove-member").click()
self.assertTrue("Are you sure" in self.driver.page_source)

self.driver.find_element_by_id("remove-member").submit()
self.assertTrue("student1@aol.com" not in self.driver.page_source)
self.assertTrue("No Submission" in self.driver.page_source)

def test_login_admin_reject(self):
self.login(role="student")
self._login(role="student")
self.pageLoad(self.get_server_url() + "/admin/")
self.assertTrue("not on the course staff" in self.driver.page_source)
self.assertIn('Courses | Ok', self.driver.title)

def test_assignment_info(self):
self.login(role="admin")
self._login(role="admin")
self.pageLoad(self.get_server_url() + "/admin/course/1/assignments/1")
self.assertIn('Ok -', self.driver.title)
self.assertTrue("Hog" in self.driver.page_source)
Expand All @@ -103,7 +188,7 @@ def test_assignment_info(self):
self.assertTrue("Hog Stats" in self.driver.page_source)

def test_queue_create(self):
self.login(role="admin")
self._login(role="admin")
self.pageLoad(self.get_server_url() + "/admin/")
# if needed for debug: self.driver.get_screenshot_as_file('staff.png')

Expand Down

0 comments on commit b4a712b

Please sign in to comment.