From 428b37282752939504b35c85cfa37828f15ef3ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 17 Nov 2017 16:50:49 +0100 Subject: [PATCH] Add exams API (#30) --- .../java/io/github/wulkanowy/api/Vulcan.java | 5 + .../io/github/wulkanowy/api/exams/Day.java | 29 ++++++ .../io/github/wulkanowy/api/exams/Exam.java | 59 +++++++++++ .../github/wulkanowy/api/exams/ExamsWeek.java | 65 +++++++++++++ .../io/github/wulkanowy/api/exams/Week.java | 28 ++++++ .../wulkanowy/api/exams/ExamsWeekTest.java | 97 +++++++++++++++++++ .../api/exams/Sprawdziany-one-per-day.html | 85 ++++++++++++++++ 7 files changed, 368 insertions(+) create mode 100644 app/src/main/java/io/github/wulkanowy/api/exams/Day.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/exams/Exam.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java create mode 100644 app/src/main/java/io/github/wulkanowy/api/exams/Week.java create mode 100644 app/src/test/java/io/github/wulkanowy/api/exams/ExamsWeekTest.java create mode 100644 app/src/test/resources/io/github/wulkanowy/api/exams/Sprawdziany-one-per-day.html diff --git a/app/src/main/java/io/github/wulkanowy/api/Vulcan.java b/app/src/main/java/io/github/wulkanowy/api/Vulcan.java index 29200a5ed..fb965fb43 100644 --- a/app/src/main/java/io/github/wulkanowy/api/Vulcan.java +++ b/app/src/main/java/io/github/wulkanowy/api/Vulcan.java @@ -4,6 +4,7 @@ import java.io.IOException; import io.github.wulkanowy.api.attendance.AttendanceStatistics; import io.github.wulkanowy.api.attendance.AttendanceTable; +import io.github.wulkanowy.api.exams.ExamsWeek; import io.github.wulkanowy.api.grades.GradesList; import io.github.wulkanowy.api.grades.SubjectsList; import io.github.wulkanowy.api.login.AccountPermissionException; @@ -81,6 +82,10 @@ public class Vulcan extends Api { return new AttendanceTable(getStudentAndParent()); } + public ExamsWeek getExamsList() throws IOException, NotLoggedInErrorException { + return new ExamsWeek(getStudentAndParent()); + } + public GradesList getGradesList() throws IOException, NotLoggedInErrorException { return new GradesList(getStudentAndParent()); } diff --git a/app/src/main/java/io/github/wulkanowy/api/exams/Day.java b/app/src/main/java/io/github/wulkanowy/api/exams/Day.java new file mode 100644 index 000000000..752006dd4 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/exams/Day.java @@ -0,0 +1,29 @@ +package io.github.wulkanowy.api.exams; + +import java.util.ArrayList; +import java.util.List; + +public class Day { + + private List examList = new ArrayList<>(); + + private String date = ""; + + public String getDate() { + return date; + } + + public Day setDate(String date) { + this.date = date; + return this; + } + + public List getExamList() { + return examList; + } + + public Day addExam(Exam exam) { + this.examList.add(exam); + return this; + } +} diff --git a/app/src/main/java/io/github/wulkanowy/api/exams/Exam.java b/app/src/main/java/io/github/wulkanowy/api/exams/Exam.java new file mode 100644 index 000000000..466bfe4f7 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/exams/Exam.java @@ -0,0 +1,59 @@ +package io.github.wulkanowy.api.exams; + +public class Exam { + + private String subjectAndGroup = ""; + + private String type = ""; + + private String description = ""; + + private String teacher = ""; + + private String entryDate = ""; + + public String getSubjectAndGroup() { + return subjectAndGroup; + } + + public Exam setSubjectAndGroup(String subjectAndGroup) { + this.subjectAndGroup = subjectAndGroup; + return this; + } + + public String getType() { + return type; + } + + public Exam setType(String type) { + this.type = type; + return this; + } + + public String getDescription() { + return description; + } + + public Exam setDescription(String description) { + this.description = description; + return this; + } + + public String getTeacher() { + return teacher; + } + + public Exam setTeacher(String teacher) { + this.teacher = teacher; + return this; + } + + public String getEntryDate() { + return entryDate; + } + + public Exam setEntryDate(String entryDate) { + this.entryDate = entryDate; + return this; + } +} diff --git a/app/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java b/app/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java new file mode 100644 index 000000000..2c2555764 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/exams/ExamsWeek.java @@ -0,0 +1,65 @@ +package io.github.wulkanowy.api.exams; + +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import io.github.wulkanowy.api.StudentAndParent; + +public class ExamsWeek { + + private final StudentAndParent snp; + + private final String examsPageUrl = "Sprawdziany.mvc/Terminarz?rodzajWidoku=2&data="; + + public ExamsWeek(StudentAndParent snp) { + this.snp = snp; + } + + public Week getCurrent() throws IOException { + return getWeek("", true); + } + + public Week getWeek(String tick, final boolean onlyNotEmpty) throws IOException { + Document examsPage = snp.getSnPPageDocument(examsPageUrl + tick); + Elements examsDays = examsPage.select(".mainContainer > div:not(.navigation)"); + + List days = new ArrayList<>(); + + for (Element item : examsDays) { + Day day = new Day(); + Element dayHeading = item.select("h2").first(); + + if (null == dayHeading && onlyNotEmpty) { + continue; + } + + if (null != dayHeading) { + day = new Day().setDate(dayHeading.text().split(", ")[1]); + } + + Elements exams = item.select("article"); + for (Element e : exams) { + day.addExam(new Exam() + .setSubjectAndGroup(snp.getRowDataChildValue(e, 1)) + .setType(snp.getRowDataChildValue(e, 2)) + .setDescription(snp.getRowDataChildValue(e, 3)) + .setTeacher(snp.getRowDataChildValue(e, 4).split(", ")[0]) + .setEntryDate(snp.getRowDataChildValue(e, 4).split(", ")[1]) + ); + } + + days.add(day); + } + + Week week = new Week(); + week.setStartDate(examsDays.select("h2").first().text().split(" ")[1]); + week.setDayList(days); + + return week; + } +} diff --git a/app/src/main/java/io/github/wulkanowy/api/exams/Week.java b/app/src/main/java/io/github/wulkanowy/api/exams/Week.java new file mode 100644 index 000000000..8019601f6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/exams/Week.java @@ -0,0 +1,28 @@ +package io.github.wulkanowy.api.exams; + +import java.util.ArrayList; +import java.util.List; + +public class Week { + + private List dayList = new ArrayList<>(); + + private String startDate = ""; + + public List getDayList() { + return dayList; + } + + public Week setDayList(List dayList) { + this.dayList = dayList; + return this; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } +} diff --git a/app/src/test/java/io/github/wulkanowy/api/exams/ExamsWeekTest.java b/app/src/test/java/io/github/wulkanowy/api/exams/ExamsWeekTest.java new file mode 100644 index 000000000..9f9b5e77b --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/api/exams/ExamsWeekTest.java @@ -0,0 +1,97 @@ +package io.github.wulkanowy.api.exams; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +import io.github.wulkanowy.api.StudentAndParentTestCase; + +public class ExamsWeekTest extends StudentAndParentTestCase { + + private ExamsWeek onePerDay; + + @Before + public void getCurrent() throws Exception { + onePerDay = new ExamsWeek(getSnp("Sprawdziany-one-per-day.html")); + } + + @Test + public void getWeekTest() throws Exception { + Assert.assertEquals("23.10.2017", onePerDay.getCurrent().getStartDate()); + } + + @Test + public void getDaysListTest() throws Exception { + Assert.assertEquals(3, onePerDay.getCurrent().getDayList().size()); + Assert.assertEquals(7, onePerDay.getWeek("", false).getDayList().size()); + } + + @Test + public void getExamsListTest() throws Exception { + List notEmpty = onePerDay.getCurrent().getDayList(); + Assert.assertEquals(1, notEmpty.get(0).getExamList().size()); + Assert.assertEquals(1, notEmpty.get(1).getExamList().size()); + Assert.assertEquals(1, notEmpty.get(2).getExamList().size()); + + List emptyToo = onePerDay.getWeek("", false).getDayList(); + Assert.assertEquals(1, emptyToo.get(0).getExamList().size()); + Assert.assertEquals(1, emptyToo.get(1).getExamList().size()); + Assert.assertEquals(1, emptyToo.get(4).getExamList().size()); + } + + @Test + public void getDayDateTest() throws Exception { + List dayList = onePerDay.getCurrent().getDayList(); + + Assert.assertEquals("23.10.2017", dayList.get(0).getDate()); + Assert.assertEquals("24.10.2017", dayList.get(1).getDate()); + Assert.assertEquals("27.10.2017", dayList.get(2).getDate()); + } + + @Test + public void getExamSubjectAndGroupTest() throws Exception { + List dayList = onePerDay.getCurrent().getDayList(); + + Assert.assertEquals("Sieci komputerowe 3Ti|zaw2", dayList.get(0).getExamList().get(0).getSubjectAndGroup()); + Assert.assertEquals("Język angielski 3Ti|J1", dayList.get(1).getExamList().get(0).getSubjectAndGroup()); + Assert.assertEquals("Metodologia programowania 3Ti|zaw2", dayList.get(2).getExamList().get(0).getSubjectAndGroup()); + } + + @Test + public void getExamTypeTest() throws Exception { + List dayList = onePerDay.getCurrent().getDayList(); + + Assert.assertEquals("Sprawdzian", dayList.get(0).getExamList().get(0).getType()); + Assert.assertEquals("Sprawdzian", dayList.get(1).getExamList().get(0).getType()); + Assert.assertEquals("Sprawdzian", dayList.get(2).getExamList().get(0).getType()); + } + + @Test + public void getExamDescriptionTest() throws Exception { + List dayList = onePerDay.getCurrent().getDayList(); + + Assert.assertEquals("Łącza danych", dayList.get(0).getExamList().get(0).getDescription()); + Assert.assertEquals("Czasy teraźniejsze", dayList.get(1).getExamList().get(0).getDescription()); + Assert.assertEquals("", dayList.get(2).getExamList().get(0).getDescription()); + } + + @Test + public void getExamTeacherTest() throws Exception { + List dayList = onePerDay.getCurrent().getDayList(); + + Assert.assertEquals("Adam Wiśniewski [AW]", dayList.get(0).getExamList().get(0).getTeacher()); + Assert.assertEquals("Natalia Nowak [NN]", dayList.get(1).getExamList().get(0).getTeacher()); + Assert.assertEquals("Małgorzata Nowacka [MN]", dayList.get(2).getExamList().get(0).getTeacher()); + } + + @Test + public void getExamEntryDateTest() throws Exception { + List dayList = onePerDay.getCurrent().getDayList(); + + Assert.assertEquals("16.10.2017", dayList.get(0).getExamList().get(0).getEntryDate()); + Assert.assertEquals("17.10.2017", dayList.get(1).getExamList().get(0).getEntryDate()); + Assert.assertEquals("16.10.2017", dayList.get(2).getExamList().get(0).getEntryDate()); + } +} diff --git a/app/src/test/resources/io/github/wulkanowy/api/exams/Sprawdziany-one-per-day.html b/app/src/test/resources/io/github/wulkanowy/api/exams/Sprawdziany-one-per-day.html new file mode 100644 index 000000000..ecc48cf16 --- /dev/null +++ b/app/src/test/resources/io/github/wulkanowy/api/exams/Sprawdziany-one-per-day.html @@ -0,0 +1,85 @@ + + + + + Witryna ucznia i rodzica – Terminarz sprawdzianów + + +
+

Sprawdziany

+

Tydzień 23.10.2017 - 29.10.2017

+
+

poniedziałek, 23.10.2017

+
+
+
Przedmiot i grupa:
+
Sieci komputerowe 3Ti|zaw2
+
+
+
Rodzaj sprawdzianu:
+
Sprawdzian
+
+
+
Opis:
+
Łącza danych
+
+
+
Nauczyciel i data wpisu:
+
Adam Wiśniewski [AW], 16.10.2017
+
+
+
+
+

wtorek, 24.10.2017

+
+
+
Przedmiot i grupa:
+
Język angielski 3Ti|J1
+
+
+
Rodzaj sprawdzianu:
+
Sprawdzian
+
+
+
Opis:
+
Czasy teraźniejsze
+
+
+
Nauczyciel i data wpisu:
+
Natalia Nowak [NN], 17.10.2017
+
+
+
+
+
+
+

piątek, 27.10.2017

+
+
+
Przedmiot i grupa:
+
Metodologia programowania 3Ti|zaw2
+
+
+
Rodzaj sprawdzianu:
+
Sprawdzian
+
+
+
Opis:
+
+
+
+
Nauczyciel i data wpisu:
+
Małgorzata Nowacka [MN], 16.10.2017
+
+
+
+
+
+ +
+ + +