From 1056a1ff2ad8110577fda89e1d95e96d1b8e8dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 21 Jan 2024 16:19:28 +0100 Subject: [PATCH] Add support for new AccountInactiveException error message --- .../interceptor/AutoLoginInterceptor.kt | 9 ++-- .../scrapper/interceptor/ErrorInterceptor.kt | 13 +++-- .../wulkanowy/sdk/scrapper/login/LoginTest.kt | 43 +++++++++++++--- .../login/Logowanie-brak-dostepu2.html | 50 +++++++++++++++++++ .../scrapper/login/Logowanie-nieaktywne2.html | 25 ++++++++++ 5 files changed, 124 insertions(+), 16 deletions(-) create mode 100644 sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-brak-dostepu2.html create mode 100644 sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-nieaktywne2.html diff --git a/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/AutoLoginInterceptor.kt b/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/AutoLoginInterceptor.kt index a396380a..678a7ee6 100644 --- a/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/AutoLoginInterceptor.kt +++ b/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/AutoLoginInterceptor.kt @@ -95,15 +95,16 @@ internal class AutoLoginInterceptor( val messages = getModuleCookies(UrlGenerator.Site.MESSAGES) val student = getModuleCookies(UrlGenerator.Site.STUDENT) - val studentPlus = if (isEduOne) { - getModuleCookies(UrlGenerator.Site.STUDENT_PLUS) - } else null + val studentPlus = when { + isEduOne -> getModuleCookies(UrlGenerator.Site.STUDENT_PLUS) + else -> null + } when { "wiadomosciplus" in uri.host -> messages.getOrThrow() "uczenplus" in uri.host -> studentPlus?.getOrThrow() "uczen" in uri.host -> student.getOrThrow() - else -> logger.info("Resource don't need further login") + else -> logger.info("Resource don't need further login anyway") } chain.proceed(chain.request().attachModuleHeaders()) } catch (e: IOException) { diff --git a/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/ErrorInterceptor.kt b/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/ErrorInterceptor.kt index 4d3db961..88a80d5c 100644 --- a/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/ErrorInterceptor.kt +++ b/sdk-scrapper/src/main/kotlin/io/github/wulkanowy/sdk/scrapper/interceptor/ErrorInterceptor.kt @@ -81,6 +81,9 @@ internal class ErrorInterceptor( doc.select("h2.error").let { if (it.isNotEmpty()) throw AccountPermissionException(it.text()) } + doc.select("h2").text().let { + if (it == "Strona nie znaleziona") throw ScrapperException(it, httpCode) + } doc.selectFirst("form")?.attr("action")?.let { if ("SetNewPassword" in it) { @@ -94,13 +97,18 @@ internal class ErrorInterceptor( throw AccountInactiveException(it.select(".additionalText").text()) } } + doc.select(".info-error-message-text").let { + if ("Nie masz wystarczających uprawnień" in it.text()) { + throw AccountInactiveException(it.text()) + } + } when (doc.title()) { "Błąd" -> throw VulcanException(doc.body().text(), httpCode) "Błąd strony" -> throw VulcanException(doc.select(".errorMessage").text(), httpCode) "Logowanie" -> throw AccountPermissionException( buildString { - val newMessage = doc.select(".info-error-message-text").first()?.text().orEmpty() + val newMessage = doc.select(".info-error-message-text").first()?.ownText().orEmpty() val oldMessage = doc.select("div").last()?.ownText().orEmpty().split(" Jeśli")[0] append(newMessage.ifBlank { oldMessage }) }, @@ -121,9 +129,6 @@ internal class ErrorInterceptor( "Strona nie została odnaleziona" -> throw ScrapperException(doc.title(), httpCode) "Strona nie znaleziona" -> throw ScrapperException(doc.selectFirst("div div")?.text().orEmpty(), httpCode) } - doc.select("h2").text().let { - if (it == "Strona nie znaleziona") throw ScrapperException(it, httpCode) - } if (isBobCmn(doc, redirectUrl)) { throw ConnectionBlockedException("Połączenie zablokowane przez system antybotowy. Spróbuj ponownie za chwilę") } diff --git a/sdk-scrapper/src/test/kotlin/io/github/wulkanowy/sdk/scrapper/login/LoginTest.kt b/sdk-scrapper/src/test/kotlin/io/github/wulkanowy/sdk/scrapper/login/LoginTest.kt index ba26d870..d43e6e69 100644 --- a/sdk-scrapper/src/test/kotlin/io/github/wulkanowy/sdk/scrapper/login/LoginTest.kt +++ b/sdk-scrapper/src/test/kotlin/io/github/wulkanowy/sdk/scrapper/login/LoginTest.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.sdk.scrapper.exception.VulcanException import io.github.wulkanowy.sdk.scrapper.interceptor.ErrorInterceptorTest import io.github.wulkanowy.sdk.scrapper.service.LoginService import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -120,19 +121,31 @@ class LoginTest : BaseLocalTest() { } @Test - fun accessAccountInactiveException() { + fun accessAccountInactiveException() = runTest { with(server) { enqueue("Logowanie-uonet.html") enqueue("Logowanie-nieaktywne.html") start(3000) } - try { - runBlocking { normal.login("jan@fakelog.cf", "jan1234") } - } catch (e: Throwable) { - assertEquals(AccountInactiveException::class, e::class) - assertEquals("Login i hasło użytkownika są poprawne, ale konto nie jest aktywne w żadnej jednostce sprawozdawczej", e.message) + val result = runCatching { normal.login("jan@fakelog.cf", "jan1234") } + val error = result.exceptionOrNull()!! + assertEquals(AccountInactiveException::class, error::class) + assertEquals("Login i hasło użytkownika są poprawne, ale konto nie jest aktywne w żadnej jednostce sprawozdawczej", error.message) + } + + @Test + fun accessAccountInactiveNewException() = runTest { + with(server) { + enqueue("Logowanie-uonet.html") + enqueue("Logowanie-nieaktywne2.html") + start(3000) } + + val result = runCatching { normal.login("jan@fakelog.cf", "jan1234") } + val error = result.exceptionOrNull()!! + assertEquals(AccountInactiveException::class, error::class) + assertEquals("Nie masz wystarczających uprawnień, by używać aplikacji", error.message) } @Test @@ -165,18 +178,32 @@ class LoginTest : BaseLocalTest() { } @Test - fun accessPermissionException() { + fun accessPermissionException() = runTest { with(server) { enqueue("Logowanie-uonet.html") enqueue("Logowanie-brak-dostepu.html") start(3000) } + val result = runCatching { adfs.login("jan@fakelog.cf", "jan1234") } + val exception = result.exceptionOrNull()!! + assertEquals(AccountPermissionException::class, exception::class) + assertEquals("Adres nie został zarejestrowany w dzienniku uczniowskim jako adres rodzica, bądź ucznia.", exception.message) + } + + @Test + fun accessPermissionNewException() { + with(server) { + enqueue("Logowanie-uonet.html") + enqueue("Logowanie-brak-dostepu2.html") + start(3000) + } + try { runBlocking { adfs.login("jan@fakelog.cf", "jan1234") } } catch (e: Throwable) { assertTrue(e is AccountPermissionException) - assertEquals("Adres mikolajpich@gmail.com nie został zarejestrowany w dzienniku uczniowskim jako adres rodzica, bądź ucznia.", e.message) + assertEquals("Login nie został zarejestrowany w bazie szkoły, do której się logujesz.", e.message) } } diff --git a/sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-brak-dostepu2.html b/sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-brak-dostepu2.html new file mode 100644 index 00000000..8389a33c --- /dev/null +++ b/sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-brak-dostepu2.html @@ -0,0 +1,50 @@ + + + + + + Logowanie + + +
+
+ +
+ +
+ + +
+
+ + + +
+
+ + diff --git a/sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-nieaktywne2.html b/sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-nieaktywne2.html new file mode 100644 index 00000000..2bc2a629 --- /dev/null +++ b/sdk-scrapper/src/test/resources/io/github/wulkanowy/sdk/scrapper/login/Logowanie-nieaktywne2.html @@ -0,0 +1,25 @@ + + + + + + Dziennik VULCAN + + + +
+ + + +
+ +