From 0aa083c8aa335b06e6183e9574989ea4e0a3479b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 4 Aug 2017 14:06:37 +0200 Subject: [PATCH] Add ability to change grades list semester (#10) --- .../io/github/wulkanowy/api/Semester.java | 35 +++++++++++ .../wulkanowy/api/StudentAndParent.java | 52 +++++++++++++++- .../java/io/github/wulkanowy/api/Vulcan.java | 11 ++++ .../wulkanowy/api/grades/GradesList.java | 21 ++++--- .../io/github/wulkanowy/api/notes/Notes.java | 4 +- .../wulkanowy/api/StudentAndParentTest.java | 61 +++++++++++++++++++ .../api/OcenyWszystkie-semester.html | 21 +++++++ 7 files changed, 193 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/api/Semester.java create mode 100644 app/src/test/java/io/github/wulkanowy/api/StudentAndParentTest.java create mode 100644 app/src/test/resources/io/github/wulkanowy/api/OcenyWszystkie-semester.html diff --git a/app/src/main/java/io/github/wulkanowy/api/Semester.java b/app/src/main/java/io/github/wulkanowy/api/Semester.java new file mode 100644 index 000000000..90b03ff89 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/api/Semester.java @@ -0,0 +1,35 @@ +package io.github.wulkanowy.api; + +public class Semester { + + private String number = ""; + private String id = ""; + private boolean isCurrent = false; + + public String getNumber() { + return number; + } + + public Semester setNumber(String number) { + this.number = number; + return this; + } + + public String getId() { + return id; + } + + public Semester setId(String id) { + this.id = id; + return this; + } + + public boolean isCurrent() { + return isCurrent; + } + + public Semester setCurrent(boolean current) { + isCurrent = current; + return this; + } +} diff --git a/app/src/main/java/io/github/wulkanowy/api/StudentAndParent.java b/app/src/main/java/io/github/wulkanowy/api/StudentAndParent.java index c2dd0922f..d6640c895 100644 --- a/app/src/main/java/io/github/wulkanowy/api/StudentAndParent.java +++ b/app/src/main/java/io/github/wulkanowy/api/StudentAndParent.java @@ -4,8 +4,11 @@ import org.jsoup.Connection; import org.jsoup.Jsoup; 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 java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,15 +18,22 @@ public class StudentAndParent extends Vulcan { private String startPageUrl = "https://uonetplus.vulcan.net.pl/{locationID}/Start.mvc/Index"; - private String locationID; + private String gradesPageUrl = "https://uonetplus-opiekun.vulcan.net.pl/{locationID}/{ID}/" + + "Oceny/Wszystkie"; - private String uonetPlusOpiekunUrl; + private String locationID = ""; + + private String uonetPlusOpiekunUrl = ""; public StudentAndParent(Cookies cookies, String locID) throws IOException { this.cookies = cookies; this.locationID = locID; } + public String getGradesPageUrl() { + return gradesPageUrl; + } + public StudentAndParent setUp() throws IOException { startPageUrl = startPageUrl.replace("{locationID}", locationID); @@ -67,4 +77,42 @@ public class StudentAndParent extends Vulcan { public String getRowDataChildValue(Element e, int index) { return e.select(".daneWiersz .wartosc").get(index - 1).text(); } + + public List getSemesters() throws IOException, LoginErrorException { + String url = getGradesPageUrl(); + url = url.replace("{locationID}", getLocationID()); + url = url.replace("{ID}", getID()); + + Document gradesPage = getPageByUrl(url); + Elements semesterOptions = gradesPage.select("#okresyKlasyfikacyjneDropDownList option"); + + List semesters = new ArrayList<>(); + + for (Element e : semesterOptions) { + Semester semester = new Semester() + .setId(e.text()) + .setNumber(e.attr("value")); + + if ("selected".equals(e.attr("selected"))) { + semester.setCurrent(true); + } + + semesters.add(semester); + } + + return semesters; + } + + public Semester getCurrentSemester(List semesterList) + throws IOException, LoginErrorException { + Semester current = null; + for (Semester s : semesterList) { + if (s.isCurrent()) { + current = s; + break; + } + } + + return current; + } } 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 e149d8e18..ff5efac1b 100644 --- a/app/src/main/java/io/github/wulkanowy/api/Vulcan.java +++ b/app/src/main/java/io/github/wulkanowy/api/Vulcan.java @@ -1,5 +1,9 @@ package io.github.wulkanowy.api; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; import java.util.Map; public abstract class Vulcan { @@ -23,4 +27,11 @@ public abstract class Vulcan { this.cookies.addItems(cookies); return this.cookies; } + + public Document getPageByUrl(String url) throws IOException { + return Jsoup.connect(url) + .followRedirects(true) + .cookies(getCookies()) + .get(); + } } diff --git a/app/src/main/java/io/github/wulkanowy/api/grades/GradesList.java b/app/src/main/java/io/github/wulkanowy/api/grades/GradesList.java index a38b54547..82350f499 100644 --- a/app/src/main/java/io/github/wulkanowy/api/grades/GradesList.java +++ b/app/src/main/java/io/github/wulkanowy/api/grades/GradesList.java @@ -1,6 +1,5 @@ package io.github.wulkanowy.api.grades; -import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; @@ -20,8 +19,8 @@ public class GradesList extends Vulcan { private StudentAndParent snp = null; - private String gradesPageUrl = - "https://uonetplus-opiekun.vulcan.net.pl/{locationID}/{ID}/Oceny/Wszystkie?details=2"; + private String gradesPageUrl = "https://uonetplus-opiekun.vulcan.net.pl/{locationID}/{ID}" + + "/Oceny/Wszystkie?details=2&okres="; private List grades = new ArrayList<>(); @@ -30,14 +29,20 @@ public class GradesList extends Vulcan { this.snp = snp; } + public String getGradesPageUrl() { + return gradesPageUrl; + } + public List getAll() throws IOException, LoginErrorException { - gradesPageUrl = gradesPageUrl.replace("{locationID}", snp.getLocationID()); - gradesPageUrl = gradesPageUrl.replace("{ID}", snp.getID()); + return getAll(snp.getCurrentSemester(snp.getSemesters()).getNumber()); + } - Document marksPage = Jsoup.connect(gradesPageUrl) - .cookies(getCookies()) - .get(); + public List getAll(String semester) throws IOException, LoginErrorException { + String url = getGradesPageUrl(); + url = url.replace("{locationID}", snp.getLocationID()); + url = url.replace("{ID}", snp.getID()); + Document marksPage = getPageByUrl(url + semester); Elements marksRows = marksPage.select(".ocenySzczegoly-table > tbody > tr"); for (Element row : marksRows) { diff --git a/app/src/main/java/io/github/wulkanowy/api/notes/Notes.java b/app/src/main/java/io/github/wulkanowy/api/notes/Notes.java index a05f011c9..e3fe550e6 100644 --- a/app/src/main/java/io/github/wulkanowy/api/notes/Notes.java +++ b/app/src/main/java/io/github/wulkanowy/api/notes/Notes.java @@ -14,8 +14,8 @@ public class Notes extends Vulcan { private StudentAndParent snp = null; - private String notesPageUrl = - "https://uonetplus-opiekun.vulcan.net.pl/{locationID}/{ID}/UwagiOsiagniecia.mvc/Wszystkie"; + private String notesPageUrl = "https://uonetplus-opiekun.vulcan.net.pl/{locationID}/{ID}/" + + "UwagiOsiagniecia.mvc/Wszystkie"; public Notes(Cookies cookies, StudentAndParent snp) { this.cookies = cookies; diff --git a/app/src/test/java/io/github/wulkanowy/api/StudentAndParentTest.java b/app/src/test/java/io/github/wulkanowy/api/StudentAndParentTest.java new file mode 100644 index 000000000..5b92d23c0 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/api/StudentAndParentTest.java @@ -0,0 +1,61 @@ +package io.github.wulkanowy.api; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; + +import java.util.ArrayList; +import java.util.List; +public class StudentAndParentTest { + + private String fixtureFileName = "OcenyWszystkie-semester.html"; + + private StudentAndParent snp; + + @Before + public void setUp() throws Exception { + String input = FixtureHelper.getAsString(getClass().getResourceAsStream(fixtureFileName)); + Document gradesPageDocument = Jsoup.parse(input); + + snp = Mockito.mock(StudentAndParent.class); + PowerMockito.whenNew(StudentAndParent.class) + .withArguments(Mockito.any(Cookies.class), Mockito.anyString()).thenReturn(snp); + + Mockito.when(snp.getPageByUrl(Mockito.anyString())).thenReturn(gradesPageDocument); + Mockito.when(snp.getGradesPageUrl()).thenReturn("http://example.null"); + Mockito.when(snp.getLocationID()).thenReturn("symbol"); + Mockito.when(snp.getID()).thenReturn("123456"); + Mockito.when(snp.getSemesters()).thenCallRealMethod(); + Mockito.when(snp.getCurrentSemester(Mockito.anyListOf(Semester.class))).thenCallRealMethod(); + } + + @Test + public void getSemestersTest() throws Exception { + List semesters = snp.getSemesters(); + + Assert.assertEquals(2, semesters.size()); + + Assert.assertEquals("1", semesters.get(0).getId()); + Assert.assertEquals("1234", semesters.get(0).getNumber()); + Assert.assertFalse(semesters.get(0).isCurrent()); + + Assert.assertEquals("2", semesters.get(1).getId()); + Assert.assertEquals("1235", semesters.get(1).getNumber()); + Assert.assertTrue(semesters.get(1).isCurrent()); + } + + @Test + public void getCurrentSemesterTest() throws Exception { + List semesters = new ArrayList<>(); + semesters.add(new Semester().setNumber("1500100900").setId("1").setCurrent(false)); + semesters.add(new Semester().setNumber("1500100901").setId("2").setCurrent(true)); + + Assert.assertTrue(snp.getCurrentSemester(semesters).isCurrent()); + Assert.assertEquals("2", snp.getCurrentSemester(semesters).getId()); + Assert.assertEquals("1500100901", snp.getCurrentSemester(semesters).getNumber()); + } +} diff --git a/app/src/test/resources/io/github/wulkanowy/api/OcenyWszystkie-semester.html b/app/src/test/resources/io/github/wulkanowy/api/OcenyWszystkie-semester.html new file mode 100644 index 000000000..f4b712c17 --- /dev/null +++ b/app/src/test/resources/io/github/wulkanowy/api/OcenyWszystkie-semester.html @@ -0,0 +1,21 @@ + + + + + Witryna ucznia i rodzica – Oceny + + +
+

Oceny

+
+
+ + +
+
+ + +