Skip to content

Commit

Permalink
Add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mavidser committed Oct 22, 2020
1 parent 8d2ba63 commit a151caf
Show file tree
Hide file tree
Showing 3 changed files with 268 additions and 0 deletions.
Empty file.
131 changes: 131 additions & 0 deletions sql_grader/tests/unit/fixtures/rating.sql
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);
137 changes: 137 additions & 0 deletions sql_grader/tests/unit/test_problem.py
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)

0 comments on commit a151caf

Please sign in to comment.