001package edu.pdx.cs.joy.grader;
002
003import edu.pdx.cs.joy.grader.gradebook.Student;
004import org.junit.jupiter.api.Test;
005
006import java.io.File;
007import java.io.IOException;
008import java.time.LocalDateTime;
009import java.util.List;
010import java.util.Set;
011
012import static org.hamcrest.MatcherAssert.assertThat;
013import static org.hamcrest.Matchers.containsString;
014import static org.hamcrest.Matchers.not;
015import static org.hamcrest.core.IsEqual.equalTo;
016import static org.junit.jupiter.api.Assertions.assertThrows;
017
018public class SubmitTest {
019
020  @Test
021  public void nineDigitStringIsInvalidLoginId() {
022    Submit submit = new Submit();
023    assertThat(submit.isNineDigitStudentId("123456789"), equalTo(true));
024  }
025
026  @Test
027  public void eightDigitStringIsValidLoginId() {
028    Submit submit = new Submit();
029    assertThat(submit.isNineDigitStudentId("12345678"), equalTo(false));
030  }
031
032  @Test
033  public void userNameIsValidLoginId() {
034    Submit submit = new Submit();
035    assertThat(submit.isNineDigitStudentId("whitlock"), equalTo(false));
036  }
037
038  @Test
039  public void emailAddressIsInvalidLoginId() {
040    Submit submit = new Submit();
041    assertThat(submit.looksLikeAnEmailAddress("me@email.com"), equalTo(true));
042  }
043
044  @Test
045  public void canSubmitClassesInStudentPackage() {
046    String userId = "student";
047
048    File file = makeFileWithPath("src", "main", "java", "edu", "pdx", "cs", "joy", userId, "ProjectClass.java");
049    Submit submit = new Submit();
050    submit.setStudent(new Student(userId));
051    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
052  }
053
054  private File makeFileWithPath(String... path) {
055    File dir = new File(System.getProperty("user.dir"));
056
057    for (String part : path) {
058      dir = new File(dir, part);
059    }
060
061    return dir;
062  }
063
064  @Test
065  public void canSubmitClassesInSubPackage() {
066    String userId = "student";
067
068    File file = makeFileWithPath("src", "main", "java", "edu", "pdx", "cs", "joy", userId, "subpackage", "ProjectClass.java");
069    Submit submit = new Submit();
070    submit.setStudent(new Student(userId));
071    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
072  }
073
074  @Test
075  public void submissionTimeIsInIsoDateTime() {
076    LocalDateTime time = LocalDateTime.of(2018, 7, 8, 5, 59, 32);
077    String formattedTime = Submit.ManifestAttributes.formatSubmissionTime(time);
078    assertThat(formattedTime, equalTo("2018-07-08T05:59:32"));
079  }
080
081  @Test
082  public void legacySubmissionTimeCanBeParsed() {
083    String legacySubmissionTime = "2018-Jul-08 05:59:32";
084    LocalDateTime expected = LocalDateTime.of(2018, 7, 8, 5, 59, 32);
085
086    LocalDateTime actual = Submit.ManifestAttributes.parseSubmissionTime(legacySubmissionTime);
087    assertThat(actual, equalTo(expected));
088  }
089
090  @Test
091  public void canSubmitTestClasses() {
092    String userId = "student";
093
094    File file = makeFileWithPath("src", "test", "java", "edu", "pdx", "cs", "joy", userId, "subpackage", "ProjectTest.java");
095    Submit submit = new Submit();
096    submit.setStudent(new Student(userId));
097    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
098  }
099
100  @Test
101  public void canSubmitIntegrationTestClasses() {
102    String userId = "student";
103
104    File file = makeFileWithPath("src", "it", "java", "edu", "pdx", "cs", "joy", userId, "subpackage", "ProjectTest.java");
105    Submit submit = new Submit();
106    submit.setStudent(new Student(userId));
107    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
108  }
109
110  @Test
111  public void canSubmitMainJavaDocPackageHtml() {
112    String userId = "student";
113
114    File file = makeFileWithPath("src", "main", "javadoc", "edu", "pdx", "cs", "joy", userId, "package.html");
115    Submit submit = new Submit();
116    submit.setStudent(new Student(userId));
117    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
118  }
119
120  @Test
121  public void cantSubmitPomXml() {
122    String userId = "student";
123
124    File file = makeFileWithPath("proj", "pom.xml");
125    Submit submit = new Submit();
126    submit.setStudent(new Student(userId));
127    assertThat(submit.isInMavenProjectDirectory(file), equalTo(false));
128  }
129
130  @Test
131  public void cantSubmitJavaFileInGroovyDirectory() {
132    String userId = "student";
133
134    File file = makeFileWithPath("src", "main", "groovy", "edu", "pdx", "cs", "joy", userId, "Project.java");
135    Submit submit = new Submit();
136    submit.setStudent(new Student(userId));
137    assertThat(submit.isInMavenProjectDirectory(file), equalTo(false));
138  }
139
140  @Test
141  public void zipFileEntryNameForSourceFile() {
142    String entryName = "src/main/java/edu/pdx/cs/joy/student/Project.java";
143    String fileName = "directory" + "/" + entryName;
144    assertThat(Submit.getZipEntryNameFor(fileName), equalTo(entryName));
145  }
146
147  @Test
148  public void zipFileEntryNameForBadSourceFileThrowsException() {
149    String badFileName = "dir/src/bad/java/edu/pdx/cs/joy/student/File.java";
150    assertThrows(IllegalStateException.class, () -> Submit.getZipEntryNameFor(badFileName));
151  }
152
153  @Test
154  public void canSubmitPackageHtmlForMainTestAndIT() {
155    assertThat(canFileBeSubmitted("src/main/javadoc/edu/pdx/cs/joy/student/package.html"), equalTo(true));
156    assertThat(canFileBeSubmitted("src/test/javadoc/edu/pdx/cs/joy/student/package.html"), equalTo(true));
157    assertThat(canFileBeSubmitted("src/it/javadoc/edu/pdx/cs/joy/student/package.html"), equalTo(true));
158  }
159
160  private boolean canFileBeSubmitted(String fileName) {
161    return Submit.canFileBeSubmitted(new File(fileName));
162  }
163
164  @Test
165  public void zipFileEntryNameForSourceJavadocFile() {
166    String entryName = "src/main/javadoc/edu/pdx/cs/joy/student/package.html";
167    String fileName = "directory" + "/" + entryName;
168    assertThat(Submit.getZipEntryNameFor(fileName), equalTo(entryName));
169  }
170
171  @Test
172  public void canSubmitXmlFilesFromTestResourcesDirectory() {
173    assertThat(canFileBeSubmitted("src/test/resources/edu/pdx/cs/joy/student/testData.xml"), equalTo(true));
174    assertThat(canFileBeSubmitted("src/it/resources/edu/pdx/cs/joy/student/testData.xml"), equalTo(true));
175  }
176
177  @Test
178  public void mainResourcesDirectoryIsAnAllowedMavenDirectory() {
179    String userId = "student";
180
181    File file = makeFileWithPath("src", "main", "resources", "edu", "pdx", "cs", "joy", userId, "testData.xml");
182    Submit submit = new Submit();
183    submit.setStudent(new Student(userId));
184    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
185  }
186
187  @Test
188  public void canSubmitTestResourcesXmlFile() {
189    String userId = "student";
190
191    File file = makeFileWithPath("src", "test", "resources", "edu", "pdx", "cs", "joy", userId, "testData.xml");
192    Submit submit = new Submit();
193    submit.setStudent(new Student(userId));
194    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
195  }
196
197  @Test
198  public void canSubmitIntegrationTestResourcesXmlFile() {
199    String userId = "student";
200
201    File file = makeFileWithPath("src", "it", "resources", "edu", "pdx", "cs", "joy", userId, "testData.xml");
202    Submit submit = new Submit();
203    submit.setStudent(new Student(userId));
204    assertThat(submit.isInMavenProjectDirectory(file), equalTo(true));
205  }
206
207  @Test
208  public void zipFileEntryNameForTestResourcesFile() {
209    String entryName = "src/test/resources/edu/pdx/cs/joy/student/testData.xml";
210    String fileName = "directory" + "/" + entryName;
211    assertThat(Submit.getZipEntryNameFor(fileName), equalTo(entryName));
212  }
213
214  @Test
215  public void canSubmitTxtFilesFromResourcesDirectory() {
216    assertThat(canFileBeSubmitted("src/main/resources/edu/pdx/cs/joy/student/text.txt"), equalTo(true));
217    assertThat(canFileBeSubmitted("src/test/resources/edu/pdx/cs/joy/student/testData.txt"), equalTo(true));
218    assertThat(canFileBeSubmitted("src/it/resources/edu/pdx/cs/joy/student/testData.txt"), equalTo(true));
219  }
220
221  @Test
222  public void cannotSubmitTxtFilesFromJavaDirectory() {
223    assertThat(canFileBeSubmitted("src/main/java/edu/pdx/cs/joy/student/text.txt"), equalTo(false));
224    assertThat(canFileBeSubmitted("src/test/java/edu/pdx/cs/joy/student/testData.txt"), equalTo(false));
225    assertThat(canFileBeSubmitted("src/it/java/edu/pdx/cs/joy/student/testData.txt"), equalTo(false));
226  }
227
228  @Test
229  public void canSubmitTxtFilesFromResourcesDirectoryInCodeDirectoryWithJavaInTheName() {
230    assertThat(canFileBeSubmitted("code/java/checkout/src/main/resources/edu/pdx/cs/joy/student/text.txt"), equalTo(true));
231    assertThat(canFileBeSubmitted("code/java/checkout/src/test/resources/edu/pdx/cs/joy/student/testData.txt"), equalTo(true));
232    assertThat(canFileBeSubmitted("code/java/checkout/src/it/resources/edu/pdx/cs/joy/student/testData.txt"), equalTo(true));
233  }
234
235  @Test
236  public void testClassesWereSubmitted() {
237    Set<File> files = Set.of(
238      makeFileWithPath("src", "test", "java", "edu", "pdx", "cs", "joy", "student", "StudentTest.java")
239    );
240
241    assertThat(Submit.submittedTestClasses(files), equalTo(true));
242  }
243
244  @Test
245  public void notestClassesWereSubmitted() {
246    Set<File> files = Set.of(
247      makeFileWithPath("src", "main", "java", "edu", "pdx", "cs", "joy", "student", "Student.java")
248    );
249
250    assertThat(Submit.submittedTestClasses(files), equalTo(false));
251  }
252
253  @Test
254  public void canSubmitKoansFile() throws IOException {
255    String[] dirs = {"src", "beginner"};
256    String fileName = "AboutKoans.java";
257
258    assertFileCanBeSubmitted("whitlock", fileName, dirs, true);
259  }
260
261  @Test
262  public void canSubmitProjectFile() throws IOException {
263    String userId = "whitlock";
264    String fileName = "Project1.java";
265    String[] dirs = {"src", "main", "java", "edu", "pdx", "cs", "joy", userId};
266
267
268    assertFileCanBeSubmitted(userId, fileName, dirs, true);
269  }
270
271  private void assertFileCanBeSubmitted(String userId, String fileName, String[] dirs, boolean canSubmit) throws IOException {
272    File dir = new File(System.getProperty("user.dir"));
273    for (String dirName : dirs) {
274      dir = new File(dir, dirName);
275      dir.mkdirs();
276    }
277
278    File projectFile = new File(dir, fileName);
279    projectFile.createNewFile();
280
281    Submit submit = new Submit();
282    submit.setStudent(new Student(userId));
283    assertThat(submit.canBeSubmitted(projectFile), equalTo(canSubmit));
284  }
285
286  @Test
287  public void cannotSubmitFilesWithoutFileExtension() throws IOException {
288    String userId = "whitlock";
289    String fileName = "noExtension";
290    String[] dirs = {"src", "main", "resources", "edu", "pdx", "cs", "joy", userId};
291
292    assertFileCanBeSubmitted(userId, fileName, dirs, false);
293  }
294
295  @Test
296  public void cannotSubmitFilesOnNoSubmitList() throws IOException {
297    String userId = "whitlock";
298    String fileName = "AbstractAirline.java";
299    String[] dirs = {"src", "main", "java", "edu", "pdx", "cs", "joy", userId};
300
301    assertFileCanBeSubmitted(userId, fileName, dirs, false);
302  }
303
304  @Test
305  public void invalidProjectNameThrowsIllegalStateException() {
306    Submit submit = new Submit();
307    submit.setProjectName("invalid");
308    assertThrows(IllegalStateException.class, submit::validateProjectName);
309  }
310
311  @Test
312  public void validateProjectName() {
313    List.of("koans", "Project1", "Project4").forEach(
314      projectName -> {
315        Submit submit = new Submit();
316        submit.setProjectName(projectName);
317        submit.validateProjectName();
318      }
319    );
320  }
321
322  @Test
323  void zipFileAttachmentDoesNotContainStudentNickName() {
324    Student student = new Student("studentId");
325    String firstName = "FirstName";
326    String nickName = "NickName";
327    String lastName = "LastName";
328
329    student.setFirstName(firstName);
330    student.setNickName(nickName);
331    student.setLastName(lastName);
332
333    Submit submit = new Submit();
334    submit.setStudent(student);
335
336    String zipFileTitle = submit.getZipFileTitle();
337
338    assertThat(zipFileTitle, containsString(firstName));
339    assertThat(zipFileTitle, containsString(lastName));
340    assertThat(zipFileTitle, not(containsString(nickName)));
341  }
342
343}