diff --git a/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java b/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java index 01ca241dad..c42e3d3a66 100644 --- a/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java +++ b/main/src/main/java/org/mobilitydata/gtfsvalidator/table/GtfsStopSchema.java @@ -20,7 +20,7 @@ import org.mobilitydata.gtfsvalidator.annotation.*; @GtfsTable("stops.txt") -@Required +@ConditionallyRequired public interface GtfsStopSchema extends GtfsEntity { @FieldType(FieldTypeEnum.ID) @PrimaryKey diff --git a/main/src/main/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidator.java b/main/src/main/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidator.java new file mode 100644 index 0000000000..9d00ffbbbd --- /dev/null +++ b/main/src/main/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidator.java @@ -0,0 +1,28 @@ +package org.mobilitydata.gtfsvalidator.validator; + +import javax.inject.Inject; +import org.mobilitydata.gtfsvalidator.annotation.GtfsValidator; +import org.mobilitydata.gtfsvalidator.notice.MissingRequiredFileNotice; +import org.mobilitydata.gtfsvalidator.notice.NoticeContainer; +import org.mobilitydata.gtfsvalidator.table.*; + +@GtfsValidator +public class MissingStopsFileValidator extends FileValidator { + + private final GtfsStopTableContainer stopTableContainer; + private final GtfsGeojsonFeaturesContainer geojsonFeaturesContainer; + + @Inject + MissingStopsFileValidator( + GtfsStopTableContainer table, GtfsGeojsonFeaturesContainer geojsonFeaturesContainer) { + this.stopTableContainer = table; + this.geojsonFeaturesContainer = geojsonFeaturesContainer; + } + + @Override + public void validate(NoticeContainer noticeContainer) { + if (stopTableContainer.isMissingFile() && geojsonFeaturesContainer.isMissingFile()) { + noticeContainer.addValidationNotice(new MissingRequiredFileNotice("stops.txt")); + } + } +} diff --git a/main/src/test/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidatorTest.java b/main/src/test/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidatorTest.java new file mode 100644 index 0000000000..88a6dfae60 --- /dev/null +++ b/main/src/test/java/org/mobilitydata/gtfsvalidator/validator/MissingStopsFileValidatorTest.java @@ -0,0 +1,43 @@ +package org.mobilitydata.gtfsvalidator.validator; + +import static com.google.common.truth.Truth.assertThat; + +import java.util.ArrayList; +import org.junit.Test; +import org.mobilitydata.gtfsvalidator.notice.MissingRequiredFileNotice; +import org.mobilitydata.gtfsvalidator.notice.NoticeContainer; +import org.mobilitydata.gtfsvalidator.table.GtfsGeojsonFeaturesContainer; +import org.mobilitydata.gtfsvalidator.table.GtfsGeojsonFileDescriptor; +import org.mobilitydata.gtfsvalidator.table.GtfsStopTableContainer; +import org.mobilitydata.gtfsvalidator.table.TableStatus; + +public class MissingStopsFileValidatorTest { + @Test + public void stopsTxtMissingFileShouldGenerateNotice() { + // If stops.txt is missing and locations.geojson is missing, a notice should be generated + NoticeContainer noticeContainer = new NoticeContainer(); + GtfsGeojsonFileDescriptor descriptor = new GtfsGeojsonFileDescriptor(); + GtfsGeojsonFeaturesContainer geoJsonFeaturesContainer = + descriptor.createContainerForInvalidStatus(TableStatus.MISSING_FILE); + GtfsStopTableContainer stopTableContainer = + GtfsStopTableContainer.forStatus(TableStatus.MISSING_FILE); + new MissingStopsFileValidator(stopTableContainer, geoJsonFeaturesContainer) + .validate(noticeContainer); + assertThat(noticeContainer.getValidationNotices()) + .containsExactly(new MissingRequiredFileNotice("stops.txt")); + } + + @Test + public void stopsTxtMissingFileShouldNotGenerateNotice() { + // If stops.txt is missing, but locations.geojson is present, no notice should be generated + NoticeContainer noticeContainer = new NoticeContainer(); + GtfsGeojsonFileDescriptor descriptor = new GtfsGeojsonFileDescriptor(); + GtfsGeojsonFeaturesContainer geoJsonFeaturesContainer = + descriptor.createContainerForEntities(new ArrayList<>(), noticeContainer); + GtfsStopTableContainer stopTableContainer = + GtfsStopTableContainer.forStatus(TableStatus.MISSING_FILE); + new MissingStopsFileValidator(stopTableContainer, geoJsonFeaturesContainer) + .validate(noticeContainer); + assertThat(noticeContainer.getValidationNotices()).isEmpty(); + } +}