Skip to content

Commit

Permalink
Fix issue 1 by handling more filename cases in the ExtensionValidator (
Browse files Browse the repository at this point in the history
…#17)

* Fix extension validator to handle filenames with extra periods

* Handle more filename cases in the ExtensionValidator

* Fix for code formatting issues: Only one method invocation is expected when testing runtime exceptions

* Fix formatting issues.

* Delete invalid space.
  • Loading branch information
rick-boardontrack authored Aug 29, 2024
1 parent 29d62f4 commit 46caab4
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,30 @@ public boolean isValid(Object value) {
return Arrays.stream(extensions).anyMatch(ext -> ext.equals(getExtension(value)));
}

private String getExtension(Object value) {
if (value instanceof Path) {
return ((Path) value).toString().split("\\.")[1];
} else if (value instanceof File) {
return ((File) value).getName().split("\\.")[1];
private String getExtension(Object value) throws IllegalArgumentException {
String fileName;

if (value instanceof File) {
fileName = ((File) value).getName();
} else if (value instanceof Path) {
fileName = ((Path) value).getFileName().toString();
} else if (value instanceof String) {
throw new ValidationException("Cannot get a extension from java.lang.String.");
} else {
throw new ValidationException("Cannot get a extension from {0}.", value.getClass().getName(), null);
throw new ValidationException("Input must be a File or Path.");
}

if (fileName == null || fileName.isEmpty()) {
throw new ValidationException("File name is null or empty.");
}

int lastDotIndex = fileName.lastIndexOf('.');

if (lastDotIndex == -1 || lastDotIndex == 0 || lastDotIndex == fileName.length() - 1) {
throw new ValidationException("No valid file extension found.");
}

return fileName.substring(lastDotIndex + 1);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import java.io.File;
import java.lang.annotation.Annotation;
import java.nio.file.Path;
import java.nio.file.Paths;

import static org.junit.jupiter.api.Assertions.assertEquals;
Expand Down Expand Up @@ -59,6 +60,90 @@ void shouldThrownExceptionWhenNonExpectedObjectIsPassed() {
assertEquals(expectedMessage, actualMessage);
}

@Test
void shouldThrownExceptionForHiddenFilesInFile() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
File file = new File(".hiddenfile");
var exception = assertThrows(ValidationException.class, () -> validator.isValid(file));
var actualMessage = exception.getMessage();
var expectedMessage = "No valid file extension found.";
assertEquals(expectedMessage, actualMessage);
}

@Test
void shouldThrownExceptionForHiddenFilesInPath() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
Path path = new File(".hiddenfile").toPath();
var exception = assertThrows(ValidationException.class, () -> validator.isValid(path));
var actualMessage = exception.getMessage();
var expectedMessage = "No valid file extension found.";
assertEquals(expectedMessage, actualMessage);
}

@Test
void shouldThrownExceptionForEmptyFilenameInFile() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
File file = new File("");
var exception = assertThrows(ValidationException.class, () -> validator.isValid(file));
var actualMessage = exception.getMessage();
var expectedMessage = "File name is null or empty.";
assertEquals(expectedMessage, actualMessage);
}

@Test
void shouldThrownExceptionForEmptyFilenameInPath() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
Path path = new File("").toPath();
var exception = assertThrows(ValidationException.class, () -> validator.isValid(path));
var actualMessage = exception.getMessage();
var expectedMessage = "File name is null or empty.";
assertEquals(expectedMessage, actualMessage);
}

@Test
void shouldSucceedWithExtraPeriodsInFilename() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
File file = new File("/a/b/c/foo.bar.baz.mp3");
assertEquals(Boolean.TRUE, validator.isValid(file));
}

@Test
void shouldSucceedWithExtraPeriodsInPath() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
File file = new File("a/b/c/foo.bar.baz.mp3");
assertEquals(Boolean.TRUE, validator.isValid(file.toPath()));
}

@Test
void shouldReturnFalseWithExtraPeriodsInFile() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
File file = new File("a/b/c/foo.mp3.wav.txt");
assertEquals(Boolean.FALSE, validator.isValid(file));
}

@Test
void shouldReturnFalseWithExtraPeriodsInPath() {
var validator = new ExtensionValidator();
var annotation = Sample.extension(new String[] { "mp3", "wav" });
validator.initialize(annotation);
File file = new File("a/b/c/foo.mp3.wav.txt");
assertEquals(Boolean.FALSE, validator.isValid(file.toPath()));
}

static class Sample {

static Extension extension(String[] value) {
Expand Down

0 comments on commit 46caab4

Please sign in to comment.