Skip to content

Commit

Permalink
groupshared: Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
rkdarst committed Jul 30, 2019
1 parent 4b02a66 commit 93ed21e
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 16 deletions.
6 changes: 5 additions & 1 deletion nbgrader/tests/apps/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,11 @@ def _make_file(self, path, contents=""):
fh.write(contents)

def _get_permissions(self, filename):
return oct(os.stat(filename).st_mode)[-3:]
st_mode = os.stat(filename).st_mode
# If setgid is true, return four bytes. For testing CourseDirectory.groupshared.
if st_mode & 0o2000:
return oct(st_mode)[-4:]
return oct(st_mode)[-3:]

def _file_contents(self, path):
with open(path, "r") as fh:
Expand Down
27 changes: 23 additions & 4 deletions nbgrader/tests/apps/test_nbgrader_autograde.py
Original file line number Diff line number Diff line change
Expand Up @@ -526,11 +526,14 @@ def test_skip_extra_notebooks(self, db, course_dir):
assert os.path.isfile(join(course_dir, "autograded", "foo", "ps1", "p1.ipynb"))
assert not os.path.isfile(join(course_dir, "autograded", "foo", "ps1", "p1 copy.ipynb"))

def test_permissions(self, course_dir):
@pytest.mark.parametrize("groupshared", [False, True])
def test_permissions(self, course_dir, groupshared):
"""Are permissions properly set?"""
with open("nbgrader_config.py", "a") as fh:
fh.write("""c.CourseDirectory.db_assignments = [dict(name='ps1', duedate='2015-02-02 14:58:23.948203 America/Los_Angeles')]\n""")
fh.write("""c.CourseDirectory.db_students = [dict(id="foo"), dict(id="bar")]""")
fh.write("""c.CourseDirectory.db_students = [dict(id="foo"), dict(id="bar")]\n""")
if groupshared:
fh.write("""c.CourseDirectory.groupshared = True\n""")

self._empty_notebook(join(course_dir, "source", "ps1", "foo.ipynb"))
self._make_file(join(course_dir, "source", "ps1", "foo.txt"), "foo")
Expand All @@ -540,10 +543,26 @@ def test_permissions(self, course_dir):
self._make_file(join(course_dir, "source", "foo", "ps1", "foo.txt"), "foo")
run_nbgrader(["autograde", "ps1"])

if not groupshared:
if sys.platform == 'win32':
perms = '666'
else:
perms = '444'
else:
if sys.platform == 'win32':
perms = '666'
dirperms = '777'
else:
perms = '664'
dirperms = '2775'

assert os.path.isfile(join(course_dir, "autograded", "foo", "ps1", "foo.ipynb"))
assert os.path.isfile(join(course_dir, "autograded", "foo", "ps1", "foo.txt"))
assert self._get_permissions(join(course_dir, "autograded", "foo", "ps1", "foo.ipynb")) == "444"
assert self._get_permissions(join(course_dir, "autograded", "foo", "ps1", "foo.txt")) == "444"
if groupshared:
# non-groupshared doesn't make guarantees about directory perms
assert self._get_permissions(join(course_dir, "autograded", "foo", "ps1")) == dirperms
assert self._get_permissions(join(course_dir, "autograded", "foo", "ps1", "foo.ipynb")) == perms
assert self._get_permissions(join(course_dir, "autograded", "foo", "ps1", "foo.txt")) == perms

def test_custom_permissions(self, course_dir):
"""Are custom permissions properly set?"""
Expand Down
18 changes: 18 additions & 0 deletions nbgrader/tests/apps/test_nbgrader_collect.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import os
import time
import pytest

from os.path import join

from .. import run_nbgrader
from .base import BaseTestApp
Expand Down Expand Up @@ -133,3 +136,18 @@ def test_owner_check(self, exchange, course_dir, cache):
# This warning can be disabled
out = self._collect("--assignment=ps1", exchange, flags=["--ExchangeCollect.check_owner=False"])
assert 'WARNING' not in out

@notwindows
@pytest.mark.parametrize("groupshared", [False, True])
def test_permissions(self, exchange, course_dir, cache, groupshared):
if groupshared:
with open("nbgrader_config.py", "a") as fh:
fh.write("""c.CourseDirectory.groupshared = True\n""")
self._release_and_fetch("ps1", exchange, course_dir)
self._submit("ps1", exchange, cache, flags=["--student=foobar_student",])

# By default, a warning is raised if the student id does not match the directory owner
self._collect("--assignment=ps1", exchange)
assert self._get_permissions(join(exchange, "abc101", "inbound")) == ("2733" if not groupshared else "2773")
assert self._get_permissions(join(course_dir, "submitted", "foobar_student", "ps1")) == ("777" if not groupshared else "2777")
assert self._get_permissions(join(course_dir, "submitted", "foobar_student", "ps1", "p1.ipynb")) == ("644" if not groupshared else "664")
23 changes: 19 additions & 4 deletions nbgrader/tests/apps/test_nbgrader_generate_assignment.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,21 +169,36 @@ def test_force_f(self, course_dir):
assert not os.path.isfile(join(course_dir, "release", "ps1", "foo.txt"))
assert not os.path.isfile(join(course_dir, "release", "ps1", "blah.pyc"))

def test_permissions(self, course_dir):
@pytest.mark.parametrize("groupshared", [False, True])
def test_permissions(self, course_dir, groupshared):
"""Are permissions properly set?"""
self._empty_notebook(join(course_dir, 'source', 'ps1', 'foo.ipynb'))
self._make_file(join(course_dir, 'source', 'ps1', 'foo.txt'), 'foo')
with open("nbgrader_config.py", "a") as fh:
fh.write("""c.CourseDirectory.db_assignments = [dict(name="ps1")]\n""")
if groupshared:
fh.write("""c.CourseDirectory.groupshared = True\n""")
run_nbgrader(["generate_assignment", "ps1"])

if sys.platform == 'win32':
perms = '666'
if not groupshared:
if sys.platform == 'win32':
perms = '666'
else:
perms = '644'
else:
perms = '644'
if sys.platform == 'win32':
perms = '666'
dirperms = '777'
else:
perms = '664'
dirperms = '2775'

assert os.path.isfile(join(course_dir, "release", "ps1", "foo.ipynb"))
assert os.path.isfile(join(course_dir, "release", "ps1", "foo.txt"))
if groupshared:
# non-groupshared doesn't make guarantees about directory perms
assert self._get_permissions(join(course_dir, "release")) == dirperms
assert self._get_permissions(join(course_dir, "release", "ps1")) == dirperms
assert self._get_permissions(join(course_dir, "release", "ps1", "foo.ipynb")) == perms
assert self._get_permissions(join(course_dir, "release", "ps1", "foo.txt")) == perms

Expand Down
23 changes: 19 additions & 4 deletions nbgrader/tests/apps/test_nbgrader_generate_feedback.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import sys
import pytest
from os.path import join, exists, isfile

from ...utils import remove
Expand Down Expand Up @@ -171,24 +172,38 @@ def test_filter_notebook(self, db, course_dir):
assert isfile(join(course_dir, "feedback", "foo", "ps1", "data", "bar.txt"))
assert not isfile(join(course_dir, "feedback", "foo", "ps1", "blah.pyc"))

def test_permissions(self, course_dir):
@pytest.mark.parametrize("groupshared", [False, True])
def test_permissions(self, course_dir, groupshared):
"""Are permissions properly set?"""
with open("nbgrader_config.py", "a") as fh:
fh.write("""c.CourseDirectory.db_assignments = [dict(name="ps1")]\n""")
fh.write("""c.CourseDirectory.db_students = [dict(id="foo")]\n""")
if groupshared:
fh.write("""c.CourseDirectory.groupshared = True\n""")
self._empty_notebook(join(course_dir, "source", "ps1", "foo.ipynb"))
run_nbgrader(["generate_assignment", "ps1"])

self._empty_notebook(join(course_dir, "submitted", "foo", "ps1", "foo.ipynb"))
run_nbgrader(["autograde", "ps1"])
run_nbgrader(["generate_feedback", "ps1"])

if sys.platform == 'win32':
perms = '666'
if not groupshared:
if sys.platform == 'win32':
perms = '666'
else:
perms = '644'
else:
perms = '644'
if sys.platform == 'win32':
perms = '666'
dirperms = '777'
else:
perms = '664'
dirperms = '2775'

assert isfile(join(course_dir, "feedback", "foo", "ps1", "foo.html"))
if groupshared:
# non-groupshared doesn't guarantee anything about directory perms
assert self._get_permissions(join(course_dir, "feedback", "foo", "ps1")) == dirperms
assert self._get_permissions(join(course_dir, "feedback", "foo", "ps1", "foo.html")) == perms

def test_custom_permissions(self, course_dir):
Expand Down
12 changes: 12 additions & 0 deletions nbgrader/tests/apps/test_nbgrader_releaseassignment.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
import shutil
import stat
import pytest
from os.path import join

from .. import run_nbgrader
Expand Down Expand Up @@ -92,3 +93,14 @@ def test_exchange_bad_perms(self, exchange, course_dir):
self._copy_file(join("files", "test.ipynb"), join(course_dir, "release", "ps1", "p1.ipynb"))
self._release("--assignment=ps1", exchange)
assert os.path.isfile(join(exchange, "abc101", "outbound", "ps1", "p1.ipynb"))

@notwindows
@pytest.mark.parametrize("groupshared", [False, True])
def test_permissions(self, exchange, course_dir, groupshared):
if groupshared:
with open("nbgrader_config.py", "a") as fh:
fh.write("""c.CourseDirectory.groupshared = True""")
self._copy_file(join("files", "test.ipynb"), join(course_dir, "release", "ps1", "p1.ipynb"))
self._release("--assignment=ps1", exchange)
assert self._get_permissions(join(exchange, "abc101", "outbound", "ps1")) == ("755" if not groupshared else "2775")
assert self._get_permissions(join(exchange, "abc101", "outbound", "ps1", "p1.ipynb")) == ("644" if not groupshared else "664")
18 changes: 15 additions & 3 deletions nbgrader/tests/apps/test_nbgrader_releasefeedback.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
import sys
from os.path import join, exists, isfile
import pytest

from ...utils import remove, notebook_hash
from .. import run_nbgrader
Expand Down Expand Up @@ -68,23 +69,34 @@ def test_single_student(self, db, course_dir, exchange):
run_nbgrader(["release_feedback", "ps1", "--Exchange.root={}".format(exchange), '--course', 'abc101'])

@notwindows
def test_permissions(self, db, course_dir, exchange):
@pytest.mark.parametrize("groupshared", [False, True])
def test_permissions(self, db, course_dir, exchange, groupshared):
"""Are permissions properly set?"""
with open("nbgrader_config.py", "a") as fh:
fh.write("""c.CourseDirectory.db_assignments = [dict(name="ps1")]\n""")
fh.write("""c.CourseDirectory.db_students = [dict(id="foo")]\n""")
if groupshared:
fh.write("""c.CourseDirectory.groupshared = True\n""")
self._copy_file(join("files", "submitted-unchanged.ipynb"), join(course_dir, "source", "ps1", "p1.ipynb"))
run_nbgrader(["assign", "ps1", "--db", db])
nb_path = join(course_dir, "submitted", "foo", "ps1", "p1.ipynb")
self._copy_file(join("files", "submitted-unchanged.ipynb"), nb_path)
self._copy_file(join("files", "timestamp.txt"), join(course_dir, "submitted", "foo", "ps1", "timestamp.txt"))
nb_hash = notebook_hash(nb_path)

self._empty_notebook(join(course_dir, "submitted", "foo", "ps1", "foo.ipynb"))
run_nbgrader(["autograde", "ps1", "--db", db])
run_nbgrader(["generate_feedback", "ps1", "--db", db])
run_nbgrader(["release_feedback", "ps1", "--Exchange.root={}".format(exchange), '--course', 'abc101'])

perms = '711'
if groupshared:
perms = '664'
dirperms = '2771'
else:
perms = '644'
dirperms = '711'

feedback_dir = join(exchange, "abc101", "feedback")
assert self._get_permissions(feedback_dir) == perms
assert self._get_permissions(feedback_dir) == dirperms
os.system("find %s -ls"%feedback_dir)
assert self._get_permissions(join(feedback_dir, nb_hash+".html")) == perms

0 comments on commit 93ed21e

Please sign in to comment.