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}