001package edu.pdx.cs.joy.apptbook;
002
003import org.junit.jupiter.api.Test;
004import org.xml.sax.SAXException;
005import org.xml.sax.SAXParseException;
006
007import javax.xml.parsers.DocumentBuilder;
008import javax.xml.parsers.DocumentBuilderFactory;
009import javax.xml.parsers.ParserConfigurationException;
010import java.io.IOException;
011
012import static org.junit.jupiter.api.Assertions.assertThrows;
013
014class AppointmentBookXmlHelperTest {
015
016  @Test
017  void canParseValidXmlFile() throws ParserConfigurationException, IOException, SAXException {
018    DocumentBuilder builder = newValidatingDocumentBuilder(new AppointmentBookXmlHelper());
019
020    builder.parse(this.getClass().getResourceAsStream("valid-apptbook.xml"));
021  }
022
023  @Test
024  void throwsExceptionWhenParsingInvalidXmlFile() throws ParserConfigurationException {
025    DocumentBuilder builder = newValidatingDocumentBuilder(new AppointmentBookXmlHelper());
026
027    assertThrows(SAXParseException.class, () ->
028      builder.parse(this.getClass().getResourceAsStream("invalid-apptbook.xml"))
029    );
030  }
031
032  private static DocumentBuilder newValidatingDocumentBuilder(AppointmentBookXmlHelper helper) throws ParserConfigurationException {
033    DocumentBuilderFactory factory =
034      DocumentBuilderFactory.newInstance();
035    factory.setValidating(true);
036
037    DocumentBuilder builder =
038      factory.newDocumentBuilder();
039    builder.setErrorHandler(helper);
040    builder.setEntityResolver(helper);
041    return builder;
042  }
043
044}