forked from Stanford-Online/xblock-sql-grader
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
268 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
/* | ||
https://s3-us-west-2.amazonaws.com/prod-c2g/db/Winter2013/files/rating.sql | ||
https://s3-us-west-2.amazonaws.com/prod-c2g/db/Winter2013/files/viewmovie.sql | ||
*/ | ||
|
||
/* Delete the tables if they already exist */ | ||
drop table if exists Movie; | ||
drop table if exists Reviewer; | ||
drop table if exists Rating; | ||
|
||
/* Create the schema for our tables */ | ||
create table Movie(mID int, title text, year int, director text); | ||
create table Reviewer(rID int, name text); | ||
create table Rating(rID int, mID int, stars int, ratingDate date); | ||
|
||
/* Populate the tables with our data */ | ||
insert into Movie values(101, 'Gone with the Wind', 1939, 'Victor Fleming'); | ||
insert into Movie values(102, 'Star Wars', 1977, 'George Lucas'); | ||
insert into Movie values(103, 'The Sound of Music', 1965, 'Robert Wise'); | ||
insert into Movie values(104, 'E.T.', 1982, 'Steven Spielberg'); | ||
insert into Movie values(105, 'Titanic', 1997, 'James Cameron'); | ||
insert into Movie values(106, 'Snow White', 1937, null); | ||
insert into Movie values(107, 'Avatar', 2009, 'James Cameron'); | ||
insert into Movie values(108, 'Raiders of the Lost Ark', 1981, 'Steven Spielberg'); | ||
|
||
insert into Reviewer values(201, 'Sarah Martinez'); | ||
insert into Reviewer values(202, 'Daniel Lewis'); | ||
insert into Reviewer values(203, 'Brittany Harris'); | ||
insert into Reviewer values(204, 'Mike Anderson'); | ||
insert into Reviewer values(205, 'Chris Jackson'); | ||
insert into Reviewer values(206, 'Elizabeth Thomas'); | ||
insert into Reviewer values(207, 'James Cameron'); | ||
insert into Reviewer values(208, 'Ashley White'); | ||
|
||
insert into Rating values(201, 101, 2, '2011-01-22'); | ||
insert into Rating values(201, 101, 4, '2011-01-27'); | ||
insert into Rating values(202, 106, 4, null); | ||
insert into Rating values(203, 103, 2, '2011-01-20'); | ||
insert into Rating values(203, 108, 4, '2011-01-12'); | ||
insert into Rating values(203, 108, 2, '2011-01-30'); | ||
insert into Rating values(204, 101, 3, '2011-01-09'); | ||
insert into Rating values(205, 103, 3, '2011-01-27'); | ||
insert into Rating values(205, 104, 2, '2011-01-22'); | ||
insert into Rating values(205, 108, 4, null); | ||
insert into Rating values(206, 107, 3, '2011-01-15'); | ||
insert into Rating values(206, 106, 5, '2011-01-19'); | ||
insert into Rating values(207, 107, 5, '2011-01-20'); | ||
insert into Rating values(208, 104, 3, '2011-01-02'); | ||
|
||
/* Create the views */ | ||
create view LateRating as | ||
select distinct R.mID, title, stars, ratingDate | ||
from Rating R, Movie M | ||
where R.mID = M.mID | ||
and ratingDate > '2011-01-20'; | ||
|
||
create view HighlyRated as | ||
select mID, title | ||
from Movie | ||
where mID in (select mID from Rating where stars > 3); | ||
|
||
create view NoRating as | ||
select mID, title | ||
from Movie | ||
where mID not in (select mID from Rating); | ||
|
||
|
||
/* | ||
https://s3-us-west-2.amazonaws.com/prod-c2g/db/Winter2013/files/social.sql | ||
*/ | ||
|
||
/* Delete the tables if they already exist */ | ||
drop table if exists Highschooler; | ||
drop table if exists Friend; | ||
drop table if exists Likes; | ||
|
||
/* Create the schema for our tables */ | ||
create table Highschooler(ID int, name text, grade int); | ||
create table Friend(ID1 int, ID2 int); | ||
create table Likes(ID1 int, ID2 int); | ||
|
||
/* Populate the tables with our data */ | ||
insert into Highschooler values (1510, 'Jordan', 9); | ||
insert into Highschooler values (1689, 'Gabriel', 9); | ||
insert into Highschooler values (1381, 'Tiffany', 9); | ||
insert into Highschooler values (1709, 'Cassandra', 9); | ||
insert into Highschooler values (1101, 'Haley', 10); | ||
insert into Highschooler values (1782, 'Andrew', 10); | ||
insert into Highschooler values (1468, 'Kris', 10); | ||
insert into Highschooler values (1641, 'Brittany', 10); | ||
insert into Highschooler values (1247, 'Alexis', 11); | ||
insert into Highschooler values (1316, 'Austin', 11); | ||
insert into Highschooler values (1911, 'Gabriel', 11); | ||
insert into Highschooler values (1501, 'Jessica', 11); | ||
insert into Highschooler values (1304, 'Jordan', 12); | ||
insert into Highschooler values (1025, 'John', 12); | ||
insert into Highschooler values (1934, 'Kyle', 12); | ||
insert into Highschooler values (1661, 'Logan', 12); | ||
|
||
insert into Friend values (1510, 1381); | ||
insert into Friend values (1510, 1689); | ||
insert into Friend values (1689, 1709); | ||
insert into Friend values (1381, 1247); | ||
insert into Friend values (1709, 1247); | ||
insert into Friend values (1689, 1782); | ||
insert into Friend values (1782, 1468); | ||
insert into Friend values (1782, 1316); | ||
insert into Friend values (1782, 1304); | ||
insert into Friend values (1468, 1101); | ||
insert into Friend values (1468, 1641); | ||
insert into Friend values (1101, 1641); | ||
insert into Friend values (1247, 1911); | ||
insert into Friend values (1247, 1501); | ||
insert into Friend values (1911, 1501); | ||
insert into Friend values (1501, 1934); | ||
insert into Friend values (1316, 1934); | ||
insert into Friend values (1934, 1304); | ||
insert into Friend values (1304, 1661); | ||
insert into Friend values (1661, 1025); | ||
insert into Friend select ID2, ID1 from Friend; | ||
|
||
insert into Likes values(1689, 1709); | ||
insert into Likes values(1709, 1689); | ||
insert into Likes values(1782, 1709); | ||
insert into Likes values(1911, 1247); | ||
insert into Likes values(1247, 1468); | ||
insert into Likes values(1641, 1468); | ||
insert into Likes values(1316, 1304); | ||
insert into Likes values(1501, 1934); | ||
insert into Likes values(1934, 1501); | ||
insert into Likes values(1025, 1101); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
#!/usr/bin/env python | ||
""" | ||
Test basic XBlock display function | ||
""" | ||
import os | ||
|
||
from unittest import TestCase | ||
|
||
from sql_grader.problem import SqlProblem | ||
|
||
|
||
class TestGrading(TestCase): | ||
""" | ||
Test grading of different types of problems | ||
""" | ||
def setUp(self): | ||
current_folder = os.path.dirname(__file__) | ||
sql_file = "{0}/fixtures/rating.sql".format(current_folder) | ||
self.database = SqlProblem.create_database(sql_file) | ||
|
||
def test_select(self): | ||
""" | ||
Test simple SELECT statements | ||
""" | ||
verify_query = None | ||
answer_query = "SELECT * FROM Movie order by mID desc;" | ||
query = "SELECT * FROM Movie order by mID asc;" | ||
|
||
# Verify that comparison is False if is_ordered = True | ||
submission_result, answer_result, error, comparison = SqlProblem( | ||
answer_query=answer_query, | ||
database=self.database, | ||
verify_query=verify_query, | ||
is_ordered=True | ||
).attempt(query) | ||
self.assertEqual(error, None) | ||
self.assertEqual(comparison, False) | ||
self.assertEqual(submission_result, sorted(answer_result)) | ||
|
||
# Verify that comparison is True if is_ordered = False | ||
submission_result, answer_result, error, comparison = SqlProblem( | ||
answer_query=answer_query, | ||
database=self.database, | ||
verify_query=verify_query, | ||
is_ordered=False | ||
).attempt(query) | ||
self.assertEqual(error, None) | ||
self.assertEqual(comparison, True) | ||
self.assertEqual(submission_result, sorted(answer_result)) | ||
|
||
# Verify that comparison is False if different rows are returned | ||
submission_result, answer_result, error, comparison = SqlProblem( | ||
answer_query="answer_query", | ||
database=self.database, | ||
verify_query=verify_query, | ||
is_ordered=False | ||
).attempt("select * from Movie where mID=101") | ||
self.assertEqual(error, None) | ||
self.assertEqual(comparison, False) | ||
|
||
# Verify that comparison is False if different columns are returned | ||
submission_result, answer_result, error, comparison = SqlProblem( | ||
answer_query="answer_query", | ||
database=self.database, | ||
verify_query=verify_query, | ||
is_ordered=False | ||
).attempt("select mID from Movie where mID") | ||
self.assertEqual(error, None) | ||
self.assertEqual(comparison, False) | ||
|
||
def test_update_statements(self): | ||
""" | ||
Test statements which modify the table | ||
""" | ||
verify_query = "SELECT * FROM Movie where mID = 1" | ||
answer_query = "insert into Movie values(1, 'Movie', 2000, 'Director')" | ||
query = "update Movie \ | ||
set mID=1, title='Movie', year=2000, director='Director' \ | ||
where mID=101" | ||
|
||
submission_result, answer_result, error, comparison = SqlProblem( | ||
answer_query=answer_query, | ||
database=self.database, | ||
verify_query=verify_query, | ||
is_ordered=False | ||
).attempt(query) | ||
|
||
self.assertEqual(error, None) | ||
self.assertEqual(comparison, True) | ||
self.assertEqual(submission_result, answer_result) | ||
self.assertEqual(len(submission_result), 1) | ||
|
||
def test_update_multiple_statements(self): | ||
""" | ||
Test queries with multiple statements in them | ||
""" | ||
verify_query = "SELECT * FROM Movie where mID < 10" | ||
answer_query = """ | ||
insert into Movie values(1, 'Movie', 2000, 'Director'); | ||
insert into Movie values(2, 'Movie 2', 2000, 'Director 2'); | ||
""" | ||
query = """ | ||
update Movie | ||
set mID=1, title='Movie', year=2000, director='Director' | ||
where mID=101; | ||
insert into Movie values(2, 'Movie 2', 2000, 'Director 2'); | ||
""" | ||
|
||
submission_result, answer_result, error, comparison = SqlProblem( | ||
answer_query=answer_query, | ||
database=self.database, | ||
verify_query=verify_query, | ||
is_ordered=False | ||
).attempt(query) | ||
|
||
self.assertEqual(error, None) | ||
self.assertEqual(comparison, True) | ||
self.assertEqual(submission_result, answer_result) | ||
self.assertEqual(len(submission_result), 2) | ||
|
||
def test_error(self): | ||
""" | ||
Test that invalid queries produce error | ||
""" | ||
verify_query = None | ||
answer_query = "SELECT * FROM Movie;" | ||
query = "Not a SQL Query;" | ||
|
||
# Verify that comparison returns False if is_ordered = True | ||
_, _, error, _ = SqlProblem( | ||
answer_query=answer_query, | ||
database=self.database, | ||
verify_query=verify_query, | ||
is_ordered=True | ||
).attempt(query) | ||
|
||
self.assertNotEqual(error, None) |