forked from github/wulkanowy-mirror
Compare commits
No commits in common. "develop" and "0.17.4" have entirely different histories.
.bettercodehub.yml
.circleci
.editorconfig.gitea
.github
.gitignore.idea/codeStyles
.travis.ymlLICENSEREADME.cs.mdREADME.de.mdREADME.en.mdREADME.mdREADME.sk.mdapp
bitrise.jks.gpgbuild.gradlejacoco.gradlekey.p12.gpgplay-publish-lint.shproguard-rules.pro
schemas/io.github.wulkanowy.data.db.AppDatabase
26.json27.json28.json29.json30.json31.json32.json33.json34.json35.json36.json37.json38.json39.json40.json41.json42.json43.json44.json45.json46.json47.json48.json49.json50.json51.json52.json53.json54.json55.json56.json57.json58.json59.json60.json61.json62.json63.json64.json
src
androidTest/java/io/github/wulkanowy
data
db/migrations
repositories
TestEntityCreator.ktTestInternetObservingStrategy.kt
attendance
completedlessons
exam
grade
gradestatistics
luckynumber
recipient
student
timetable
utils/security
debug
@ -1,3 +1,3 @@
|
|||||||
component_depth: 10
|
component_depth: 8
|
||||||
languages:
|
languages:
|
||||||
- kotlin
|
- kotlin
|
||||||
|
@ -162,7 +162,7 @@ jobs:
|
|||||||
openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks
|
openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks
|
||||||
- run:
|
- run:
|
||||||
name: Publish release
|
name: Publish release
|
||||||
command: ./gradlew publishPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex
|
command: ./gradlew publishPlayRelease --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex
|
||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
[*]
|
|
||||||
charset=utf-8
|
|
||||||
end_of_line=lf
|
|
||||||
insert_final_newline=Advanced
|
|
||||||
indent_style=space
|
|
||||||
indent_size=4
|
|
||||||
|
|
||||||
[*.json]
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[*.{kt,kts}]
|
|
||||||
disabled_rules=import-ordering,no-wildcard-imports
|
|
@ -1,4 +0,0 @@
|
|||||||
# These are supported funding model platforms
|
|
||||||
|
|
||||||
github: wulkanowy
|
|
||||||
custom: https://www.paypal.com/paypalme/wulkanowy
|
|
@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Zaproponuj nowy pomysł dla Wulkanowego
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
** Czy Twoja prośba o funkcję jest związana z problemem? Proszę opisz.**
|
|
||||||
Jasny i zwięzły opis problemu. Np. Zawsze jestem sfrustrowany, gdy [...]
|
|
||||||
|
|
||||||
** Opisz żądane rozwiązanie **
|
|
||||||
Jasny i zwięzły opis tego, co chcesz, aby się wydarzyło.
|
|
||||||
|
|
||||||
** Opisz alternatywy, które rozważałeś **
|
|
||||||
Jasny i zwięzły opis wszelkich rozważanych alternatywnych rozwiązań lub funkcji.
|
|
||||||
|
|
||||||
** Dodatkowy kontekst **
|
|
||||||
Dodaj inny kontekst lub zrzuty ekranu dotyczące żądania funkcji tutaj.
|
|
@ -1,12 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: gradle
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
open-pull-requests-limit: 10
|
|
||||||
target-branch: develop
|
|
||||||
ignore:
|
|
||||||
- dependency-name: io.github.wulkanowy:sdk
|
|
||||||
reviewers:
|
|
||||||
- Faierbel
|
|
@ -1,18 +0,0 @@
|
|||||||
changelog:
|
|
||||||
exclude:
|
|
||||||
labels:
|
|
||||||
- "release ignore"
|
|
||||||
categories:
|
|
||||||
- title: breaking changes
|
|
||||||
labels:
|
|
||||||
- major
|
|
||||||
- title: new features
|
|
||||||
labels:
|
|
||||||
- minor
|
|
||||||
- fr:approved
|
|
||||||
- title: translation updates
|
|
||||||
labels:
|
|
||||||
- translation
|
|
||||||
- title: features
|
|
||||||
labels:
|
|
||||||
- "*"
|
|
@ -1,84 +0,0 @@
|
|||||||
name: Generate APK
|
|
||||||
|
|
||||||
env:
|
|
||||||
main_project_module: app
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types:
|
|
||||||
- closed
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
env:
|
|
||||||
RUNNER_TOOL_CACHE: /toolcache
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout the repository
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Set current date as env variable
|
|
||||||
run: echo "date_today=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Set repository name as env variable
|
|
||||||
run: echo "repository_name=$(echo '${{ gitea.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Set up JDK
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
distribution: 'zulu'
|
|
||||||
java-version: '17'
|
|
||||||
cache: 'gradle'
|
|
||||||
|
|
||||||
- name: Set up Go environment
|
|
||||||
uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: '1.22'
|
|
||||||
|
|
||||||
- name: Get hash of Gradle files
|
|
||||||
uses: https://gitea.com/actions/go-hashfiles@v0.0.1
|
|
||||||
id: get-hash
|
|
||||||
with:
|
|
||||||
patterns: |-
|
|
||||||
**/*.gradle*
|
|
||||||
|
|
||||||
- name: Cache Gradle
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: gradle-${{ runner.os }}-${{ steps.get-hash.outputs.hash }}
|
|
||||||
|
|
||||||
- name: Get app version
|
|
||||||
id: get_version
|
|
||||||
run: echo "VERSION_NAME=$(grep -m1 "versionName" app/build.gradle | awk '{print $2}' | tr -d \'\'\"\')" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Change wrapper permissions
|
|
||||||
run: chmod +x ./gradlew
|
|
||||||
|
|
||||||
- name: Setup Android SDK
|
|
||||||
uses: android-actions/setup-android@v3
|
|
||||||
|
|
||||||
- name: Build debug APK
|
|
||||||
run: ./gradlew assembleDebug
|
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v3 # not v4 because of GHES
|
|
||||||
with:
|
|
||||||
name: wulkanowy_mod_debug_builds
|
|
||||||
path: |
|
|
||||||
app/build/outputs/**/*-debug.apk
|
|
||||||
|
|
||||||
- name: Create release
|
|
||||||
uses: akkuman/gitea-release-action@v1
|
|
||||||
env:
|
|
||||||
NODE_OPTIONS: '--experimental-fetch'
|
|
||||||
with:
|
|
||||||
files: |
|
|
||||||
app/build/outputs/**/*-debug.apk
|
|
||||||
|
|
||||||
name: Release ${{ env.VERSION_NAME }} (${{ env.date_today }})
|
|
||||||
tag_name: v${{ env.VERSION_NAME }}
|
|
@ -1,12 +1,3 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Utwórz raport błędu, aby pomóc nam ulepszyć Wulkanowego
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Co powinno się dziać
|
## Co powinno się dziać
|
||||||
|
|
||||||
|
|
17
.gitignore
vendored
17
.gitignore
vendored
@ -19,7 +19,6 @@ out/
|
|||||||
# Gradle files
|
# Gradle files
|
||||||
.gradle/
|
.gradle/
|
||||||
build/
|
build/
|
||||||
.build-cache
|
|
||||||
|
|
||||||
# Local configuration file (sdk path, etc)
|
# Local configuration file (sdk path, etc)
|
||||||
local.properties
|
local.properties
|
||||||
@ -65,12 +64,6 @@ captures/
|
|||||||
.idea/uiDesigner.xml
|
.idea/uiDesigner.xml
|
||||||
.idea/runConfigurations.xml
|
.idea/runConfigurations.xml
|
||||||
.idea/discord.xml
|
.idea/discord.xml
|
||||||
.idea/migrations.xml
|
|
||||||
.idea/androidTestResultsUserPreferences.xml
|
|
||||||
.idea/copilot
|
|
||||||
.idea/deploymentTargetDropDown.xml
|
|
||||||
.idea/deploymentTargetSelector.xml
|
|
||||||
.idea/kotlinc.xml
|
|
||||||
|
|
||||||
# Keystore files
|
# Keystore files
|
||||||
*.jks
|
*.jks
|
||||||
@ -117,14 +110,6 @@ Thumbs.db
|
|||||||
*.ear
|
*.ear
|
||||||
|
|
||||||
### AndroidStudio Patch ###
|
### AndroidStudio Patch ###
|
||||||
|
|
||||||
!/gradle/wrapper/gradle-wrapper.jar
|
!/gradle/wrapper/gradle-wrapper.jar
|
||||||
.idea/jarRepositories.xml
|
.idea/jarRepositories.xml
|
||||||
|
|
||||||
### Services config files
|
|
||||||
agconnect-services.json
|
|
||||||
agconnect-credentials.json
|
|
||||||
google-services.json
|
|
||||||
!app/google-services.json
|
|
||||||
|
|
||||||
|
|
||||||
.idea/appInsightsSettings.xml
|
|
||||||
|
30
.idea/codeStyles/Project.xml
generated
30
.idea/codeStyles/Project.xml
generated
@ -2,8 +2,25 @@
|
|||||||
<code_scheme name="Project" version="173">
|
<code_scheme name="Project" version="173">
|
||||||
<option name="LINE_SEPARATOR" value=" " />
|
<option name="LINE_SEPARATOR" value=" " />
|
||||||
<JetCodeStyleSettings>
|
<JetCodeStyleSettings>
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
||||||
|
<value>
|
||||||
|
<package name="kotlinx.android.synthetic" withSubpackages="true" static="false" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
|
||||||
|
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_PARAMETER_LISTS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_ARGUMENT_LISTS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_FOR_EXPRESSION_BODIES" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_FOR_CHAINED_CALLS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_SUPERTYPE_LISTS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_IF_CONDITIONS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_ELVIS" value="false" />
|
||||||
|
<option name="WRAP_ELVIS_EXPRESSIONS" value="0" />
|
||||||
</JetCodeStyleSettings>
|
</JetCodeStyleSettings>
|
||||||
|
<MarkdownNavigatorCodeStyleSettings>
|
||||||
|
<option name="RIGHT_MARGIN" value="72" />
|
||||||
|
</MarkdownNavigatorCodeStyleSettings>
|
||||||
<codeStyleSettings language="XML">
|
<codeStyleSettings language="XML">
|
||||||
<indentOptions>
|
<indentOptions>
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
@ -117,7 +134,16 @@
|
|||||||
</arrangement>
|
</arrangement>
|
||||||
</codeStyleSettings>
|
</codeStyleSettings>
|
||||||
<codeStyleSettings language="kotlin">
|
<codeStyleSettings language="kotlin">
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
|
||||||
|
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
|
||||||
|
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
|
||||||
|
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
||||||
|
<option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" />
|
||||||
|
<option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" />
|
||||||
|
<option name="EXTENDS_LIST_WRAP" value="1" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
|
</indentOptions>
|
||||||
</codeStyleSettings>
|
</codeStyleSettings>
|
||||||
</code_scheme>
|
</code_scheme>
|
||||||
</component>
|
</component>
|
22
.travis.yml
22
.travis.yml
@ -3,8 +3,8 @@ jdk: oraclejdk8
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- ANDROID_API_LEVEL=30
|
- ANDROID_API_LEVEL=29
|
||||||
- ANDROID_BUILD_TOOLS_VERSION=30.0.2
|
- ANDROID_BUILD_TOOLS_VERSION=29.0.3
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
@ -14,7 +14,7 @@ cache:
|
|||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- develop
|
- develop
|
||||||
- 0.24.0
|
- 0.17.4
|
||||||
|
|
||||||
android:
|
android:
|
||||||
licenses:
|
licenses:
|
||||||
@ -37,10 +37,6 @@ android:
|
|||||||
- android-22
|
- android-22
|
||||||
- sys-img-armeabi-v7a-android-22
|
- sys-img-armeabi-v7a-android-22
|
||||||
|
|
||||||
before_install:
|
|
||||||
- yes | sdkmanager "platforms;android-30"
|
|
||||||
- yes | sdkmanager "build-tools;30.0.2"
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
# Launch emulator before the execution
|
# Launch emulator before the execution
|
||||||
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
|
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
|
||||||
@ -52,16 +48,20 @@ before_script:
|
|||||||
script:
|
script:
|
||||||
- ./gradlew dependencies --stacktrace --daemon
|
- ./gradlew dependencies --stacktrace --daemon
|
||||||
- fossa --no-ansi || true
|
- fossa --no-ansi || true
|
||||||
- ./gradlew -Pcoverage testFdroidDebugUnitTest --stacktrace --daemon
|
#- ./gradlew lintPlayRelease -x fabricGenerateResourcesPlayRelease --stacktrace --daemon
|
||||||
- ./gradlew -Pcoverage connectedFdroidDebugAndroidTest --stacktrace --daemon
|
- ./gradlew -Pcoverage testPlayDebugUnitTest -x fabricGenerateResourcesPlay --stacktrace --daemon
|
||||||
|
- ./gradlew -Pcoverage createFdroidDebugCoverageReport --stacktrace --daemon
|
||||||
- ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon
|
- ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon
|
||||||
|
- if [ -z ${SONAR_HOST+x} ]; then echo "sonar scan skipped"; else
|
||||||
|
git fetch --unshallow;
|
||||||
|
./gradlew sonarqube -x test -x lint -x fabricGenerateResourcesPlayRelease -x fabricGenerateResourcesFdroidRelease -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} --stacktrace --daemon;
|
||||||
|
fi
|
||||||
- |
|
- |
|
||||||
if [ $TRAVIS_TAG ]; then
|
if [ $TRAVIS_TAG ]; then
|
||||||
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg;
|
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg;
|
||||||
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/agconnect-services.json.gpg;
|
|
||||||
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg;
|
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg;
|
||||||
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg;
|
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg;
|
||||||
./gradlew publishPlayRelease --stacktrace;
|
./gradlew publishPlayRelease -PenableCrashlytics --stacktrace;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
|
2
LICENSE
2
LICENSE
@ -186,7 +186,7 @@
|
|||||||
same "printed page" as the copyright notice for easier
|
same "printed page" as the copyright notice for easier
|
||||||
identification within third-party archives.
|
identification within third-party archives.
|
||||||
|
|
||||||
Copyright 2023 Wulkanowy
|
Copyright 2019 Wulkanowy
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
33
README.cs.md
33
README.cs.md
@ -1,33 +0,0 @@
|
|||||||
Česká verze / [Deutsche Version](README.de.md) / [English version](README.en.md) / [Polska wersja](README.md) / [Slovenská verzia](README.sk.md)
|
|
||||||
|
|
||||||
# Wulkanowy MOD
|
|
||||||
|
|
||||||
## Funkce:
|
|
||||||
* skrýt známky
|
|
||||||
* Skrýt jednotlivé záznamy o docházce.
|
|
||||||
* Skrýt komentáře.
|
|
||||||
* falešná docházka %
|
|
||||||
|
|
||||||
Chcete-li se dostat na skrytý panel:
|
|
||||||
1. Přejděte na kartu „Další“.
|
|
||||||
2. Přejděte na panel „Nastavení“.
|
|
||||||
3. Přejděte na panel „O aplikaci“.
|
|
||||||
4. Klikněte 5x na logo aplikace
|
|
||||||
5. Přejděte na domovskou obrazovku
|
|
||||||
6. Přejděte do nastavení
|
|
||||||
7. Zadejte „tajná nastavení“
|
|
||||||
|
|
||||||
# Instalace
|
|
||||||
|
|
||||||
| Název souboru | Přizpůsobeno |
|
|
||||||
| ---------------- | ----------------- |
|
|
||||||
| `*-fdroid-*.apk` | F-Droid |
|
|
||||||
| `*-hms-*.apk` | Huawei AppGallery |
|
|
||||||
| `*-play-*.apk` | Play Store |
|
|
||||||
|
|
||||||
Stáhněte si vybranou verzi z [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
|
|
||||||
Doporučujeme stáhnout nejnovější dostupnou verzi.
|
|
||||||
|
|
||||||
# O projektu Wulkanowy
|
|
||||||
|
|
||||||
Chcete si přečíst více o projektu Wulkanowy? [Klikněte sem](https://github.com/wulkanowy/wulkanowy)
|
|
33
README.de.md
33
README.de.md
@ -1,33 +0,0 @@
|
|||||||
[Česká verze](README.cs.md) / Deutsche Version / [English version](README.en.md) / [Polska wersja](README.md) / [Slovenská verzia](README.sk.md)
|
|
||||||
|
|
||||||
# Wulkanowy MOD
|
|
||||||
|
|
||||||
## Funktionen:
|
|
||||||
* Noten ausblenden
|
|
||||||
* Individuelle Anwesenheitslisten ausblenden.
|
|
||||||
* Kommentare ausblenden.
|
|
||||||
* Anwesenheit fälschen %
|
|
||||||
|
|
||||||
So gelangen Sie zum ausgeblendeten Bereich:
|
|
||||||
1. Gehen Sie zur Registerkarte „Mehr“.
|
|
||||||
2. Gehen Sie zum Bereich „Einstellungen“.
|
|
||||||
3. Gehen Sie zum Bereich „Über die Anwendung“.
|
|
||||||
4. Klicken Sie fünfmal auf das Anwendungslogo
|
|
||||||
5. Gehen Sie zum Startbildschirm
|
|
||||||
6. Gehen Sie zu den Einstellungen
|
|
||||||
7. Geben Sie „Geheime Einstellungen“ ein
|
|
||||||
|
|
||||||
# Installation
|
|
||||||
|
|
||||||
| Dateiname | Angepasst an |
|
|
||||||
| ---------------- | ----------------- |
|
|
||||||
| `*-fdroid-*.apk` | F-Droid |
|
|
||||||
| `*-hms-*.apk` | Huawei AppGallery |
|
|
||||||
| `*-play-*.apk` | Play Store |
|
|
||||||
|
|
||||||
Laden Sie die ausgewählte Version von [hier](https://git.sador.me/sadorowo/wulkanowy-mod/releases) herunter.
|
|
||||||
Wir empfehlen, die neueste verfügbare Version herunterzuladen.
|
|
||||||
|
|
||||||
# Über das Wulkanowy-Projekt
|
|
||||||
|
|
||||||
Möchten Sie mehr über das Wulkanowy-Projekt lesen? [Hier klicken](https://github.com/wulkanowy/wulkanowy)
|
|
78
README.en.md
78
README.en.md
@ -1,33 +1,61 @@
|
|||||||
[Česká verze](README.cs.md) / [Deutsche Version](README.de.md) / English version / [Polska wersja](README.md) / [Slovenská verzia](README.sk.md)
|
[Polska wersja README](README.md)
|
||||||
|
|
||||||
# Wulkanowy MOD
|
# Wulkanowy
|
||||||
|
[](https://travis-ci.com/wulkanowy/wulkanowy)
|
||||||
|
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
|
[](https://discord.gg/vccAQBr)
|
||||||
|
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[](https://github.com/wulkanowy/wulkanowy/releases)
|
||||||
|
|
||||||
## Functions:
|
Unofficial android VULCAN UONET+ register client for both students and their parents
|
||||||
* hide grades
|
|
||||||
* hide individual attendance entries
|
|
||||||
* hide comments
|
|
||||||
* fake attendance %.
|
|
||||||
|
|
||||||
To get to the hidden panel:
|
## Features
|
||||||
1. Go to the "More" tab
|
|
||||||
2. Go to the "Settings" panel
|
|
||||||
3. Go to the "About application" panel
|
|
||||||
4. Click on the application logo 5 times
|
|
||||||
5. Go to the home screen
|
|
||||||
6. Go to settings
|
|
||||||
7. Enter "secret settings"
|
|
||||||
|
|
||||||
# Installation
|
* logging in using the email and password OR using token and pin
|
||||||
|
* functions from the register website:
|
||||||
|
* grades
|
||||||
|
* grade statistics
|
||||||
|
* attendance
|
||||||
|
* percentage of attendance
|
||||||
|
* exams
|
||||||
|
* timetable
|
||||||
|
* completed lessons
|
||||||
|
* messages
|
||||||
|
* homework
|
||||||
|
* notes
|
||||||
|
* lucky number
|
||||||
|
* calculation of the average independently of school's preferences
|
||||||
|
* notifications, e.g. about a new grade
|
||||||
|
* dark and black (AMOLED) theme
|
||||||
|
* offline mode
|
||||||
|
* no ads
|
||||||
|
|
||||||
| File name | Adapted to |
|
## Download
|
||||||
| ---------------- | ----------------- |
|
|
||||||
| `*-fdroid-*.apk` | F-Droid |
|
|
||||||
| `*-hms-*.apk` | Huawei AppGallery |
|
|
||||||
| `*-play-*.apk` | Play Store |
|
|
||||||
|
|
||||||
Download application from [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
|
You can download the current beta version from the Google Play or the F-Droid store
|
||||||
We recommend downloading the latest available version.
|
|
||||||
|
|
||||||
# About the Wulkanowy project
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||||
|
alt="Get it on Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Get it on F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
|
||||||
Want to read more about the Wulkanowy project? [Click here](https://github.com/wulkanowy/wulkanowy)
|
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features being prepared for the next release
|
||||||
|
|
||||||
|
## Built With
|
||||||
|
|
||||||
|
|
||||||
|
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
||||||
|
* [RxJava 2](https://github.com/ReactiveX/RxJava)
|
||||||
|
* [Dagger 2](https://github.com/google/dagger)
|
||||||
|
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
||||||
|
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Please contribute to the project either by creating a PR or submitting an issue on GitHub.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details
|
||||||
|
79
README.md
79
README.md
@ -1,33 +1,62 @@
|
|||||||
[Česká verze](README.cs.md) / [Deutsche Version](README.de.md) / [English version](README.en.md) / Polska wersja / [Slovenská verzia](README.sk.md)
|
[English version of README](README.en.md)
|
||||||
|
|
||||||
# Wulkanowy MOD
|
# Wulkanowy
|
||||||
|
[](https://travis-ci.com/wulkanowy/wulkanowy)
|
||||||
|
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
|
[](https://discord.gg/vccAQBr)
|
||||||
|
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[](https://github.com/wulkanowy/wulkanowy/releases)
|
||||||
|
|
||||||
## Funkcje:
|
Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
|
||||||
* ukryj oceny
|
|
||||||
* ukryj poszczególne wpisy frekwencji
|
|
||||||
* ukryj uwagi
|
|
||||||
* sfałszuj % frekwencji
|
|
||||||
|
|
||||||
Aby dostać się do ukrytego panelu:
|
## Funkcje
|
||||||
1. Przejdź do karty "Więcej"
|
|
||||||
2. Przejdź do panelu "Ustawienia"
|
|
||||||
3. Przejdź do panelu "O aplikacji"
|
|
||||||
4. Kliknij 5 razy w logo aplikacji
|
|
||||||
5. Przejdź na ekran główny
|
|
||||||
6. Wejdź w ustawienia
|
|
||||||
7. Wejdź w "sekretne ustawienia"
|
|
||||||
|
|
||||||
# Instalacja
|
* logowanie za pomocą e-maila i hasła LUB tokena i pinu
|
||||||
|
* funkcje ze strony internetowej dziennika:
|
||||||
|
* oceny
|
||||||
|
* statystyki ocen
|
||||||
|
* frekwencja
|
||||||
|
* procent frekwencji
|
||||||
|
* sprawdziany
|
||||||
|
* plan lekcji
|
||||||
|
* lekcje zrealizowane
|
||||||
|
* wiadomości
|
||||||
|
* zadania domowe
|
||||||
|
* uwagi
|
||||||
|
* szczęśliwy numerek
|
||||||
|
* obliczanie średniej niezależnie od preferencji szkoły
|
||||||
|
* powiadomienia np. o nowej ocenie
|
||||||
|
* ciemny i czarny (AMOLED) motyw
|
||||||
|
* tryb offilne
|
||||||
|
* brak reklam
|
||||||
|
|
||||||
| Nazwa pliku | Przystosowana do |
|
## Pobierz
|
||||||
| ---------------- | ----------------- |
|
|
||||||
| `*-fdroid-*.apk` | F-Droid |
|
|
||||||
| `*-hms-*.apk` | Huawei AppGallery |
|
|
||||||
| `*-play-*.apk` | Sklep Play |
|
|
||||||
|
|
||||||
Pobierz wybraną wersję z [wydań](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
|
Aktualną wersję beta możesz pobrać ze sklepu Google Play lub F-Droid
|
||||||
Zalecamy pobranie najnowszej dostępnej wersji.
|
|
||||||
|
|
||||||
# O projekcie Wulkanowy
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||||
|
alt="Pobierz z Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Pobierz z F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
|
||||||
Chcesz poczytać więcej o projekcie Wulkanowy? [Kliknij tutaj](https://github.com/wulkanowy/wulkanowy)
|
|
||||||
|
Możesz także pobrać [wersję rozwojową](https://wulkanowy.github.io/#download), która zawiera nowe funkcje przygotowywane do następnego wydania
|
||||||
|
|
||||||
|
|
||||||
|
## Zbudowana za pomocą
|
||||||
|
|
||||||
|
* [Wulkanowy SDK](https://github.com/wulkanowy/SDK)
|
||||||
|
* [RxJava 2](https://github.com/ReactiveX/RxJava)
|
||||||
|
* [Dagger 2](https://github.com/google/dagger)
|
||||||
|
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
||||||
|
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
||||||
|
|
||||||
|
## Współpraca
|
||||||
|
|
||||||
|
Wnieś swój wkład w projekt, tworząc PR lub wysyłając issue na GitHub.
|
||||||
|
|
||||||
|
## Licencja
|
||||||
|
|
||||||
|
Ten projekt udostępniany jest na licencji Apache License 2.0 - szczegóły w pliku [LICENSE](LICENSE)
|
||||||
|
33
README.sk.md
33
README.sk.md
@ -1,33 +0,0 @@
|
|||||||
[Česká verze](README.cs.md) / [Deutsche Version](README.de.md) / [English version](README.en.md) / [Polska wersja](README.md) / Slovenská verzia
|
|
||||||
|
|
||||||
# Wulkanowy MOD
|
|
||||||
|
|
||||||
## Funkcie:
|
|
||||||
* skryť známky
|
|
||||||
* Skryť individuálne záznamy o dochádzke.
|
|
||||||
* Skryť komentáre.
|
|
||||||
* falošná dochádzka %
|
|
||||||
|
|
||||||
Ak chcete prejsť na skrytý panel:
|
|
||||||
1. Prejdite na kartu „Viac“.
|
|
||||||
2. Prejdite na panel „Nastavenia“.
|
|
||||||
3. Prejdite na panel „O aplikácii“.
|
|
||||||
4. Kliknite 5-krát na logo aplikácie
|
|
||||||
5. Prejdite na domovskú obrazovku
|
|
||||||
6. Prejdite do nastavení
|
|
||||||
7. Zadajte „tajné nastavenia“
|
|
||||||
|
|
||||||
# Inštalácia
|
|
||||||
|
|
||||||
| Názov súboru | Prispôsobené |
|
|
||||||
| ---------------- | ----------------- |
|
|
||||||
| `*-fdroid-*.apk` | F-Droid |
|
|
||||||
| `*-hms-*.apk` | Huawei AppGallery |
|
|
||||||
| `*-play-*.apk` | Play Store |
|
|
||||||
|
|
||||||
Stiahnite si vybranú verziu z [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
|
|
||||||
Odporúčame stiahnuť najnovšiu dostupnú verziu.
|
|
||||||
|
|
||||||
# O projekte Wulkanowy
|
|
||||||
|
|
||||||
Chcete si prečítať viac o projekte Wulkanowy? [Kliknite sem](https://github.com/wulkanowy/wulkanowy)
|
|
Binary file not shown.
311
app/build.gradle
311
app/build.gradle
@ -1,52 +1,44 @@
|
|||||||
import com.github.triplet.gradle.androidpublisher.ReleaseStatus
|
|
||||||
import ru.cian.huawei.publish.ReleaseNote
|
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'kotlinx-serialization'
|
|
||||||
apply plugin: 'kotlin-parcelize'
|
|
||||||
apply plugin: 'com.google.devtools.ksp'
|
|
||||||
apply plugin: 'dagger.hilt.android.plugin'
|
|
||||||
apply plugin: 'com.google.gms.google-services'
|
|
||||||
apply plugin: 'com.google.firebase.crashlytics'
|
|
||||||
apply plugin: 'com.github.triplet.play'
|
|
||||||
apply plugin: 'ru.cian.huawei-publish'
|
|
||||||
apply plugin: 'com.mikepenz.aboutlibraries.plugin'
|
|
||||||
apply plugin: 'com.huawei.agconnect'
|
|
||||||
apply plugin: 'kotlin-kapt'
|
apply plugin: 'kotlin-kapt'
|
||||||
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
apply plugin: 'io.fabric'
|
||||||
|
apply plugin: 'com.github.triplet.play'
|
||||||
|
apply plugin: 'com.mikepenz.aboutlibraries.plugin'
|
||||||
apply from: 'jacoco.gradle'
|
apply from: 'jacoco.gradle'
|
||||||
apply from: 'sonarqube.gradle'
|
apply from: 'sonarqube.gradle'
|
||||||
apply from: 'hooks.gradle'
|
apply from: 'hooks.gradle'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace 'io.github.wulkanowy'
|
compileSdkVersion 29
|
||||||
compileSdk 34
|
buildToolsVersion '29.0.3'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "io.github.wulkanowy"
|
applicationId "io.github.wulkanowy"
|
||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 21
|
minSdkVersion 17
|
||||||
targetSdkVersion 34
|
targetSdkVersion 29
|
||||||
versionCode 173
|
versionCode 57
|
||||||
versionName "2.6.13"
|
versionName "0.17.4"
|
||||||
|
multiDexEnabled true
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
vectorDrawables.useSupportLibrary = true
|
||||||
resValue "string", "app_name", "Wulkanowy"
|
manifestPlaceholders = [
|
||||||
manifestPlaceholders = [admob_project_id: ""]
|
fabric_api_key : System.getenv("FABRIC_API_KEY") ?: "null",
|
||||||
|
crashlytics_enabled: project.hasProperty("enableCrashlytics")
|
||||||
buildConfigField "String", "SINGLE_SUPPORT_AD_ID", "null"
|
]
|
||||||
buildConfigField "String", "DASHBOARD_TILE_AD_ID", "null"
|
javaCompileOptions {
|
||||||
|
annotationProcessorOptions {
|
||||||
if (System.env.SET_BUILD_TIMESTAMP) {
|
arguments = [
|
||||||
buildConfigField "long", "BUILD_TIMESTAMP", String.valueOf(System.currentTimeMillis())
|
"room.schemaLocation": "$projectDir/schemas".toString(),
|
||||||
} else {
|
"room.incremental" : "true"
|
||||||
buildConfigField "long", "BUILD_TIMESTAMP", "1486235849000"
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
// https://github.com/robolectric/robolectric/issues/3928#issuecomment-395309991
|
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
|
||||||
debug.assets.srcDirs += files("$projectDir/schemas".toString())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
@ -60,88 +52,50 @@ android {
|
|||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
|
buildConfigField "boolean", "CRASHLYTICS_ENABLED", "true"
|
||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
shrinkResources true
|
shrinkResources true
|
||||||
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
// signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\""
|
|
||||||
buildConfigField "String", "SCHOOLS_BASE_URL", '"https://schools.wulkanowy.net.pl"'
|
|
||||||
}
|
}
|
||||||
debug {
|
debug {
|
||||||
minifyEnabled false
|
buildConfigField "boolean", "CRASHLYTICS_ENABLED", project.hasProperty("enableCrashlytics") ? "true" : "false"
|
||||||
shrinkResources false
|
|
||||||
resValue "string", "app_name", "Wulkanowy DEV"
|
|
||||||
applicationIdSuffix ".dev"
|
applicationIdSuffix ".dev"
|
||||||
versionNameSuffix "-dev"
|
versionNameSuffix "-dev"
|
||||||
buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\""
|
testCoverageEnabled = project.hasProperty('coverage')
|
||||||
buildConfigField "String", "SCHOOLS_BASE_URL", '"https://schools.wulkanowy.net.pl"'
|
ext.enableCrashlytics = project.hasProperty("enableCrashlytics")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
flavorDimensions += "platform"
|
flavorDimensions "platform"
|
||||||
|
|
||||||
productFlavors {
|
productFlavors {
|
||||||
hms {
|
|
||||||
dimension "platform"
|
|
||||||
manifestPlaceholders = [install_channel: "AppGallery"]
|
|
||||||
}
|
|
||||||
|
|
||||||
play {
|
play {
|
||||||
dimension "platform"
|
dimension "platform"
|
||||||
manifestPlaceholders = [
|
|
||||||
install_channel : "Google Play",
|
|
||||||
admob_project_id: System.getenv("ADMOB_PROJECT_ID") ?: "ca-app-pub-3940256099942544~3347511713"
|
|
||||||
]
|
|
||||||
buildConfigField "String", "SINGLE_SUPPORT_AD_ID", "\"${System.getenv("SINGLE_SUPPORT_AD_ID") ?: "ca-app-pub-3940256099942544/5354046379"}\""
|
|
||||||
buildConfigField "String", "DASHBOARD_TILE_AD_ID", "\"${System.getenv("DASHBOARD_TILE_AD_ID") ?: "ca-app-pub-3940256099942544/6300978111"}\""
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fdroid {
|
fdroid {
|
||||||
|
buildConfigField "boolean", "CRASHLYTICS_ENABLED", "false"
|
||||||
dimension "platform"
|
dimension "platform"
|
||||||
manifestPlaceholders = [install_channel: "F-Droid"]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
playConfigs {
|
lintOptions {
|
||||||
play { enabled.set(true) }
|
disable 'HardwareIds'
|
||||||
}
|
|
||||||
|
|
||||||
buildFeatures {
|
|
||||||
viewBinding true
|
|
||||||
buildConfig true
|
|
||||||
}
|
|
||||||
|
|
||||||
bundle {
|
|
||||||
language {
|
|
||||||
enableSplit = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
testOptions {
|
|
||||||
unitTests.includeAndroidResources = true
|
|
||||||
// workaround HMS test errors https://github.com/robolectric/robolectric/issues/2750
|
|
||||||
unitTests.all { jvmArgs '-noverify' }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
coreLibraryDesugaringEnabled true
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
sourceCompatibility JavaVersion.VERSION_17
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_17
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "17"
|
jvmTarget = "1.8"
|
||||||
freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
resources {
|
exclude 'META-INF/library_release.kotlin_module'
|
||||||
excludes += ['META-INF/library_release.kotlin_module',
|
exclude 'META-INF/library-core_release.kotlin_module'
|
||||||
'META-INF/library-core_release.kotlin_module',
|
|
||||||
'META-INF/LICENSE.md',
|
|
||||||
'META-INF/LICENSE-notice.md']
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
aboutLibraries {
|
aboutLibraries {
|
||||||
@ -149,144 +103,113 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kapt {
|
androidExtensions {
|
||||||
correctErrorTypes true
|
experimental = true
|
||||||
}
|
|
||||||
ksp {
|
|
||||||
arg("room.schemaLocation", "$projectDir/schemas".toString())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
play {
|
play {
|
||||||
|
serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL") ?: "jan@fakelog.cf"
|
||||||
|
serviceAccountCredentials = file('key.p12')
|
||||||
defaultToAppBundles = false
|
defaultToAppBundles = false
|
||||||
track = 'production'
|
track = 'alpha'
|
||||||
releaseStatus = ReleaseStatus.IN_PROGRESS
|
|
||||||
userFraction = 0.1d
|
|
||||||
updatePriority = 2
|
|
||||||
enabled.set(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
huaweiPublish {
|
|
||||||
instances {
|
|
||||||
hmsRelease {
|
|
||||||
credentialsPath = "$rootDir/app/src/release/agconnect-credentials.json"
|
|
||||||
buildFormat = "aab"
|
|
||||||
deployType = "publish"
|
|
||||||
releaseNotes = [
|
|
||||||
new ReleaseNote(
|
|
||||||
"pl-PL",
|
|
||||||
"$projectDir/src/main/play/release-notes/pl-PL/default.txt"
|
|
||||||
)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
work_manager = "2.9.0"
|
work_manager = "2.3.4"
|
||||||
android_hilt = "1.2.0"
|
room = "2.2.5"
|
||||||
room = "2.6.1"
|
dagger = "2.27"
|
||||||
chucker = "4.0.0"
|
// don't update https://github.com/ChuckerTeam/chucker/issues/242
|
||||||
mockk = "1.13.10"
|
chucker = "3.2.0"
|
||||||
coroutines = "1.8.1"
|
mockk = "1.9.2"
|
||||||
|
}
|
||||||
|
|
||||||
|
configurations.all {
|
||||||
|
resolutionStrategy.force "androidx.constraintlayout:constraintlayout:1.1.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'io.github.wulkanowy:sdk:2.6.11'
|
implementation "io.github.wulkanowy:sdk:0.17.4"
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
|
implementation "androidx.core:core-ktx:1.2.0"
|
||||||
|
implementation "androidx.activity:activity-ktx:1.1.0"
|
||||||
|
implementation "androidx.appcompat:appcompat:1.2.0-beta01"
|
||||||
|
implementation "androidx.appcompat:appcompat-resources:1.1.0"
|
||||||
|
implementation "androidx.fragment:fragment-ktx:1.2.4"
|
||||||
|
implementation "androidx.annotation:annotation:1.1.0"
|
||||||
|
implementation "androidx.multidex:multidex:2.0.1"
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3"
|
implementation "androidx.preference:preference-ktx:1.1.1"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
|
implementation "androidx.recyclerview:recyclerview:1.1.0"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:$coroutines"
|
implementation "androidx.viewpager:viewpager:1.0.0"
|
||||||
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-rc01"
|
||||||
implementation 'androidx.core:core-ktx:1.13.1'
|
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
|
||||||
implementation 'androidx.core:core-splashscreen:1.0.1'
|
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
|
||||||
implementation "androidx.activity:activity-ktx:1.9.0"
|
implementation "com.google.android.material:material:1.1.0"
|
||||||
implementation "androidx.appcompat:appcompat:1.6.1"
|
implementation "com.github.wulkanowy:material-chips-input:2.0.1"
|
||||||
implementation "androidx.fragment:fragment-ktx:1.7.0"
|
|
||||||
implementation "androidx.annotation:annotation:1.7.1"
|
|
||||||
implementation "androidx.javascriptengine:javascriptengine:1.0.0-beta01"
|
|
||||||
|
|
||||||
implementation "androidx.preference:preference-ktx:1.2.1"
|
|
||||||
implementation "androidx.recyclerview:recyclerview:1.3.2"
|
|
||||||
implementation "androidx.viewpager2:viewpager2:1.1.0-rc01"
|
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
|
|
||||||
implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0"
|
|
||||||
implementation "com.google.android.material:material:1.10.0"
|
|
||||||
implementation "com.github.wulkanowy:material-chips-input:2.3.1"
|
|
||||||
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
||||||
implementation 'com.github.lopspower:CircularImageView:4.3.0'
|
implementation "me.zhanghai.android.materialprogressbar:library:1.6.1"
|
||||||
|
|
||||||
implementation "androidx.work:work-runtime:$work_manager"
|
implementation "androidx.work:work-runtime-ktx:$work_manager"
|
||||||
playImplementation "androidx.work:work-gcm:$work_manager"
|
implementation "androidx.work:work-rxjava2:$work_manager"
|
||||||
|
implementation "androidx.work:work-gcm:$work_manager"
|
||||||
|
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.7.0"
|
implementation 'com.github.PaulinaSadowska:RxWorkManagerObservers:1.0.0'
|
||||||
|
|
||||||
implementation "androidx.room:room-runtime:$room"
|
implementation "androidx.room:room-runtime:$room"
|
||||||
|
implementation "androidx.room:room-rxjava2:$room"
|
||||||
implementation "androidx.room:room-ktx:$room"
|
implementation "androidx.room:room-ktx:$room"
|
||||||
ksp "androidx.room:room-compiler:$room"
|
kapt "androidx.room:room-compiler:$room"
|
||||||
|
|
||||||
implementation "com.google.dagger:hilt-android:$hilt_version"
|
implementation "com.google.dagger:dagger-android-support:$dagger"
|
||||||
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
|
kapt "com.google.dagger:dagger-compiler:$dagger"
|
||||||
kapt "androidx.hilt:hilt-compiler:$android_hilt"
|
kapt "com.google.dagger:dagger-android-processor:$dagger"
|
||||||
implementation "androidx.hilt:hilt-work:$android_hilt"
|
implementation "com.squareup.inject:assisted-inject-annotations-dagger2:0.5.2"
|
||||||
|
kapt "com.squareup.inject:assisted-inject-processor-dagger2:0.5.2"
|
||||||
|
|
||||||
implementation 'com.github.ncapdevi:FragNav:3.3.0'
|
implementation "eu.davidea:flexible-adapter:5.1.0"
|
||||||
implementation "com.github.YarikSOffice:lingver:1.3.0"
|
implementation "eu.davidea:flexible-adapter-ui:1.0.0"
|
||||||
|
implementation "com.aurelhubert:ahbottomnavigation:2.3.4"
|
||||||
|
implementation "com.ncapdevi:frag-nav:3.3.0"
|
||||||
|
implementation "com.github.YarikSOffice:lingver:1.2.1"
|
||||||
|
|
||||||
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
|
implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.6"
|
||||||
implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0"
|
implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
|
||||||
implementation "com.squareup.okhttp3:logging-interceptor:4.12.0"
|
implementation "io.reactivex.rxjava2:rxjava:2.2.19"
|
||||||
implementation "com.squareup.okhttp3:okhttp-urlconnection:4.12.0"
|
|
||||||
|
|
||||||
implementation "com.jakewharton.timber:timber:5.0.1"
|
implementation "com.google.code.gson:gson:2.8.6"
|
||||||
implementation 'com.github.Faierbel:slf4j-timber:2.0'
|
implementation "com.jakewharton.threetenabp:threetenabp:1.2.3"
|
||||||
implementation 'com.github.bastienpaulfr:Treessence:1.1.2'
|
implementation "com.jakewharton.timber:timber:4.7.1"
|
||||||
|
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
||||||
|
implementation "fr.bipi.treessence:treessence:0.3.2"
|
||||||
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
||||||
implementation 'io.coil-kt:coil:2.6.0'
|
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
|
||||||
implementation "io.github.wulkanowy:AppKillerManager:3.0.1"
|
implementation "io.coil-kt:coil:0.9.5"
|
||||||
implementation 'me.xdrop:fuzzywuzzy:1.4.0'
|
|
||||||
implementation 'com.fredporciuncula:flow-preferences:1.9.1'
|
|
||||||
implementation 'org.apache.commons:commons-text:1.12.0'
|
|
||||||
|
|
||||||
playImplementation platform('com.google.firebase:firebase-bom:33.0.0')
|
playImplementation 'com.google.firebase:firebase-analytics:17.3.0'
|
||||||
playImplementation 'com.google.firebase:firebase-analytics'
|
playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.5'
|
||||||
playImplementation 'com.google.firebase:firebase-messaging'
|
playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.5"
|
||||||
playImplementation 'com.google.firebase:firebase-crashlytics:'
|
playImplementation "com.google.firebase:firebase-messaging:20.1.0"
|
||||||
playImplementation 'com.google.firebase:firebase-config'
|
playImplementation "com.crashlytics.sdk.android:crashlytics:2.10.1"
|
||||||
|
playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
|
||||||
|
|
||||||
playImplementation 'com.google.android.gms:play-services-ads:22.6.0'
|
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
|
||||||
playImplementation "com.google.android.play:integrity:1.3.0"
|
|
||||||
playImplementation 'com.google.android.play:app-update-ktx:2.1.0'
|
|
||||||
playImplementation 'com.google.android.play:review-ktx:2.0.1'
|
|
||||||
playImplementation "com.google.android.ump:user-messaging-platform:2.1.0"
|
|
||||||
|
|
||||||
hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.301'
|
debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker"
|
||||||
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.303'
|
debugImplementation "com.amitshekhar.android:debug-db:1.0.6"
|
||||||
|
|
||||||
releaseImplementation "com.github.chuckerteam.chucker:library-no-op:$chucker"
|
testImplementation "junit:junit:4.13"
|
||||||
|
|
||||||
debugImplementation "com.github.chuckerteam.chucker:library:$chucker"
|
|
||||||
debugImplementation 'com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:1.0.6'
|
|
||||||
debugImplementation 'com.github.haroldadmin:WhatTheStack:1.0.0-alpha04'
|
|
||||||
|
|
||||||
testImplementation "junit:junit:4.13.2"
|
|
||||||
testImplementation "io.mockk:mockk:$mockk"
|
testImplementation "io.mockk:mockk:$mockk"
|
||||||
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines"
|
testImplementation "org.threeten:threetenbp:1.4.3"
|
||||||
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
testImplementation "org.mockito:mockito-inline:3.3.3"
|
||||||
|
|
||||||
testImplementation 'org.robolectric:robolectric:4.12.1'
|
androidTestImplementation "androidx.test:core:1.2.0"
|
||||||
testImplementation "androidx.test:runner:1.5.2"
|
androidTestImplementation "androidx.test:runner:1.2.0"
|
||||||
testImplementation "androidx.test.ext:junit:1.1.5"
|
androidTestImplementation "androidx.test.ext:junit:1.1.1"
|
||||||
testImplementation "androidx.test:core:1.5.0"
|
|
||||||
testImplementation "androidx.room:room-testing:$room"
|
|
||||||
testImplementation "com.google.dagger:hilt-android-testing:$hilt_version"
|
|
||||||
kaptTest "com.google.dagger:hilt-android-compiler:$hilt_version"
|
|
||||||
|
|
||||||
androidTestImplementation "androidx.test:core:1.5.0"
|
|
||||||
androidTestImplementation "androidx.test:runner:1.5.2"
|
|
||||||
androidTestImplementation "androidx.test.ext:junit:1.1.5"
|
|
||||||
androidTestImplementation "io.mockk:mockk-android:$mockk"
|
androidTestImplementation "io.mockk:mockk-android:$mockk"
|
||||||
|
androidTestImplementation "androidx.room:room-testing:$room"
|
||||||
androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
||||||
|
androidTestImplementation "org.mockito:mockito-android:3.3.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
apply plugin: 'com.google.gms.google-services'
|
||||||
|
@ -1,23 +1,22 @@
|
|||||||
apply plugin: "jacoco"
|
apply plugin: "jacoco"
|
||||||
|
|
||||||
jacoco {
|
jacoco {
|
||||||
toolVersion "0.8.11"
|
toolVersion "0.8.5"
|
||||||
reportsDirectory.set(file("$buildDir/reports"))
|
reportsDir = file("$buildDir/reports")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(Test).configureEach {
|
tasks.withType(Test) {
|
||||||
jacoco.includeNoLocationClasses = true
|
jacoco.includeNoLocationClasses = true
|
||||||
jacoco.excludes = ['jdk.internal.*']
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('jacocoTestReport', JacocoReport) {
|
task jacocoTestReport(type: JacocoReport) {
|
||||||
|
|
||||||
group = "Reporting"
|
group = "Reporting"
|
||||||
description = "Generate Jacoco coverage reports"
|
description = "Generate Jacoco coverage reports"
|
||||||
|
|
||||||
reports {
|
reports {
|
||||||
xml.required.set(true)
|
xml.enabled = true
|
||||||
html.required.set(true)
|
html.enabled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
def excludes = ['**/R.class',
|
def excludes = ['**/R.class',
|
||||||
@ -36,13 +35,13 @@ tasks.register('jacocoTestReport', JacocoReport) {
|
|||||||
dir: "$buildDir/intermediates/classes/debug",
|
dir: "$buildDir/intermediates/classes/debug",
|
||||||
excludes: excludes
|
excludes: excludes
|
||||||
) + fileTree(
|
) + fileTree(
|
||||||
dir: "$buildDir/tmp/kotlin-classes/fdroidDebug",
|
dir: "$buildDir/tmp/kotlin-classes/playDebug",
|
||||||
excludes: excludes
|
excludes: excludes
|
||||||
))
|
))
|
||||||
|
|
||||||
sourceDirectories.setFrom(files([
|
sourceDirectories.setFrom(files([
|
||||||
"src/main/java",
|
"src/main/java",
|
||||||
"src/fdroid/java"
|
"src/play/java"
|
||||||
]))
|
]))
|
||||||
executionData.setFrom(fileTree(
|
executionData.setFrom(fileTree(
|
||||||
dir: project.projectDir,
|
dir: project.projectDir,
|
||||||
|
BIN
app/key.p12.gpg
Normal file
BIN
app/key.p12.gpg
Normal file
Binary file not shown.
@ -1,8 +1,7 @@
|
|||||||
#!/bin/bash -
|
#!/bin/bash -
|
||||||
|
|
||||||
content=$(cat < "app/src/main/play/release-notes/pl-PL/default.txt") || exit
|
content=$(cat < "app/src/main/play/release-notes/pl-PL/default.txt") || exit
|
||||||
content2=echo "$content" | dos2unix
|
if [[ "${#content}" -gt 500 ]]; then
|
||||||
if [[ "${#content2}" -gt 500 ]]; then
|
|
||||||
echo >&2 "Release notes content has reached the limit of 500 characters"
|
echo >&2 "Release notes content has reached the limit of 500 characters"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
48
app/proguard-rules.pro
vendored
48
app/proguard-rules.pro
vendored
@ -1,22 +1,40 @@
|
|||||||
# General
|
# Optimizations
|
||||||
|
-optimizationpasses 5
|
||||||
|
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
|
||||||
|
-dontusemixedcaseclassnames
|
||||||
|
-dontskipnonpubliclibraryclasses
|
||||||
|
-dontskipnonpubliclibraryclassmembers
|
||||||
|
-dontpreverify
|
||||||
-dontobfuscate
|
-dontobfuscate
|
||||||
-ignorewarnings
|
-allowaccessmodification
|
||||||
|
-repackageclasses ''
|
||||||
|
-verbose
|
||||||
|
|
||||||
|
|
||||||
#Config for wulkanowy
|
#Keep all wulkanowy files
|
||||||
-keep class io.github.wulkanowy.** {*;}
|
-keep class io.github.wulkanowy.** {*;}
|
||||||
|
|
||||||
|
|
||||||
#Config for firebase crashlitycs
|
#Config for anallitycs
|
||||||
|
-keepattributes *Annotation*
|
||||||
-keepattributes SourceFile,LineNumberTable
|
-keepattributes SourceFile,LineNumberTable
|
||||||
|
-keep class com.crashlytics.** {*;}
|
||||||
-keep public class * extends java.lang.Exception
|
-keep public class * extends java.lang.Exception
|
||||||
|
-dontwarn com.crashlytics.**
|
||||||
|
|
||||||
|
|
||||||
#Config for Okio and OkHttp
|
#Config for OkHttp
|
||||||
-dontwarn javax.annotation.**
|
|
||||||
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
|
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
|
||||||
-dontwarn org.codehaus.mojo.animal_sniffer.*
|
-dontwarn org.codehaus.mojo.animal_sniffer.*
|
||||||
-dontwarn okhttp3.internal.platform.ConscryptPlatform
|
-dontwarn okhttp3.internal.platform.ConscryptPlatform
|
||||||
|
-dontwarn javax.annotation.**
|
||||||
|
|
||||||
|
|
||||||
|
#Config for ReactiveNetwork
|
||||||
|
-dontwarn com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork
|
||||||
|
-dontwarn io.reactivex.functions.Function
|
||||||
|
-dontwarn rx.internal.util.**
|
||||||
|
-dontwarn sun.misc.Unsafe
|
||||||
|
|
||||||
|
|
||||||
#Config for MPAndroidChart
|
#Config for MPAndroidChart
|
||||||
@ -27,16 +45,8 @@
|
|||||||
-keep class com.google.android.material.tabs.** { *; }
|
-keep class com.google.android.material.tabs.** { *; }
|
||||||
|
|
||||||
|
|
||||||
#Config for HMS SDK
|
#Config for About Libraries
|
||||||
-keepattributes *Annotation*
|
-keep class .R
|
||||||
-keepattributes Exceptions
|
-keep class **.R$* {
|
||||||
-keepattributes InnerClasses
|
<fields>;
|
||||||
-keepattributes Signature
|
}
|
||||||
-keep class com.huawei.agconnect.**{*;}
|
|
||||||
-keep class com.huawei.hianalytics.**{*;}
|
|
||||||
-keep class com.huawei.updatesdk.**{*;}
|
|
||||||
-keep class com.huawei.hms.**{*;}
|
|
||||||
|
|
||||||
|
|
||||||
#Config for Wulkanowy SDK
|
|
||||||
-keep,allowobfuscation,allowshrinking class retrofit2.Response
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
35
app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt
Normal file
35
app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/AbstractMigrationTest.kt
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package io.github.wulkanowy.data.db.migrations
|
||||||
|
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.room.testing.MigrationTestHelper
|
||||||
|
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.SharedPrefProvider
|
||||||
|
import org.junit.Rule
|
||||||
|
|
||||||
|
abstract class AbstractMigrationTest {
|
||||||
|
|
||||||
|
val dbName = "migration-test"
|
||||||
|
|
||||||
|
@get:Rule
|
||||||
|
val helper: MigrationTestHelper = MigrationTestHelper(
|
||||||
|
InstrumentationRegistry.getInstrumentation(),
|
||||||
|
AppDatabase::class.java.canonicalName,
|
||||||
|
FrameworkSQLiteOpenHelperFactory()
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getMigratedRoomDatabase(): AppDatabase {
|
||||||
|
val database = Room.databaseBuilder(ApplicationProvider.getApplicationContext(),
|
||||||
|
AppDatabase::class.java, dbName)
|
||||||
|
.addMigrations(*AppDatabase.getMigrations(SharedPrefProvider(PreferenceManager
|
||||||
|
.getDefaultSharedPreferences(ApplicationProvider.getApplicationContext())))
|
||||||
|
)
|
||||||
|
.build()
|
||||||
|
// close the database and release any stream resources when the test finishes
|
||||||
|
helper.closeWhenFinished(database)
|
||||||
|
return database
|
||||||
|
}
|
||||||
|
}
|
@ -2,41 +2,34 @@ package io.github.wulkanowy.data.db.migrations
|
|||||||
|
|
||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL
|
import android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL
|
||||||
import android.os.Build
|
|
||||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||||
import dagger.hilt.android.testing.HiltAndroidTest
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import dagger.hilt.android.testing.HiltTestApplication
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.robolectric.RobolectricTestRunner
|
|
||||||
import org.robolectric.annotation.Config
|
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
@HiltAndroidTest
|
@RunWith(AndroidJUnit4::class)
|
||||||
@RunWith(RobolectricTestRunner::class)
|
|
||||||
@Config(sdk = [Build.VERSION_CODES.O_MR1], application = HiltTestApplication::class)
|
|
||||||
class Migration12Test : AbstractMigrationTest() {
|
class Migration12Test : AbstractMigrationTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun twoNotRelatedStudents() {
|
fun twoNotRelatedStudents() {
|
||||||
helper.createDatabase(dbName, 11).apply {
|
helper.createDatabase(dbName, 11).apply {
|
||||||
// user 1
|
// user 1
|
||||||
createStudent(this, 1)
|
createStudent(this, 1, true)
|
||||||
createSemester(this, 1, false, 5, 1)
|
createSemester(this, 1, false, 5, 1)
|
||||||
createSemester(this, 1, true, 5, 2)
|
createSemester(this, 1, true, 5, 2)
|
||||||
|
|
||||||
// user 2
|
// user 2
|
||||||
createStudent(this, 2)
|
createStudent(this, 2, true)
|
||||||
createSemester(this, 2, false, 6, 1)
|
createSemester(this, 2, false, 6, 1)
|
||||||
createSemester(this, 2, true, 6, 2)
|
createSemester(this, 2, true, 6, 2)
|
||||||
close()
|
close()
|
||||||
}
|
}
|
||||||
|
|
||||||
runMigrationsAndValidate(Migration12())
|
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(2, students.size)
|
assertEquals(2, students.size)
|
||||||
|
|
||||||
@ -49,24 +42,23 @@ class Migration12Test : AbstractMigrationTest() {
|
|||||||
assertEquals(2, studentId)
|
assertEquals(2, studentId)
|
||||||
assertEquals(6, classId)
|
assertEquals(6, classId)
|
||||||
}
|
}
|
||||||
db.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun removeStudentsWithoutClassId() {
|
fun removeStudentsWithoutClassId() {
|
||||||
helper.createDatabase(dbName, 11).apply {
|
helper.createDatabase(dbName, 11).apply {
|
||||||
// user 1
|
// user 1
|
||||||
createStudent(this, 1)
|
createStudent(this, 1, true)
|
||||||
createSemester(this, 1, false, 0, 2)
|
createSemester(this, 1, false, 0, 2)
|
||||||
createStudent(this, 2)
|
createStudent(this, 2, true)
|
||||||
createSemester(this, 2, true, 1, 2)
|
createSemester(this, 2, true, 1, 2)
|
||||||
close()
|
close()
|
||||||
}
|
}
|
||||||
|
|
||||||
runMigrationsAndValidate(Migration12())
|
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(1, students.size)
|
assertEquals(1, students.size)
|
||||||
|
|
||||||
@ -74,26 +66,25 @@ class Migration12Test : AbstractMigrationTest() {
|
|||||||
assertEquals(2, studentId)
|
assertEquals(2, studentId)
|
||||||
assertEquals(1, classId)
|
assertEquals(1, classId)
|
||||||
}
|
}
|
||||||
db.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun ensureThereIsOnlyOneCurrentStudent() {
|
fun ensureThereIsOnlyOneCurrentStudent() {
|
||||||
helper.createDatabase(dbName, 11).apply {
|
helper.createDatabase(dbName, 11).apply {
|
||||||
// user 1
|
// user 1
|
||||||
createStudent(this, 1)
|
createStudent(this, 1, true)
|
||||||
createSemester(this, 1, true, 5, 2)
|
createSemester(this, 1, true, 5, 2)
|
||||||
createStudent(this, 2)
|
createStudent(this, 2, true)
|
||||||
createSemester(this, 2, true, 6, 2)
|
createSemester(this, 2, true, 6, 2)
|
||||||
createStudent(this, 3)
|
createStudent(this, 3, true)
|
||||||
createSemester(this, 3, false, 7, 2)
|
createSemester(this, 3, false, 7, 2)
|
||||||
close()
|
close()
|
||||||
}
|
}
|
||||||
|
|
||||||
runMigrationsAndValidate(Migration12())
|
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(3, students.size)
|
assertEquals(3, students.size)
|
||||||
|
|
||||||
@ -109,10 +100,9 @@ class Migration12Test : AbstractMigrationTest() {
|
|||||||
assertEquals(studentId, 3)
|
assertEquals(studentId, 3)
|
||||||
assertEquals(true, isCurrent)
|
assertEquals(true, isCurrent)
|
||||||
}
|
}
|
||||||
db.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createStudent(db: SupportSQLiteDatabase, studentId: Int) {
|
private fun createStudent(db: SupportSQLiteDatabase, studentId: Int, isCurrent: Boolean) {
|
||||||
db.insert("Students", CONFLICT_FAIL, ContentValues().apply {
|
db.insert("Students", CONFLICT_FAIL, ContentValues().apply {
|
||||||
put("endpoint", "https://fakelog.cf")
|
put("endpoint", "https://fakelog.cf")
|
||||||
put("loginType", "STANDARD")
|
put("loginType", "STANDARD")
|
||||||
@ -123,7 +113,7 @@ class Migration12Test : AbstractMigrationTest() {
|
|||||||
put("student_name", "Jan Kowalski")
|
put("student_name", "Jan Kowalski")
|
||||||
put("school_id", "000123")
|
put("school_id", "000123")
|
||||||
put("school_name", "")
|
put("school_name", "")
|
||||||
put("is_current", true)
|
put("is_current", isCurrent)
|
||||||
put("registration_date", "0")
|
put("registration_date", "0")
|
||||||
})
|
})
|
||||||
}
|
}
|
@ -2,26 +2,16 @@ package io.github.wulkanowy.data.db.migrations
|
|||||||
|
|
||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import android.database.sqlite.SQLiteDatabase
|
import android.database.sqlite.SQLiteDatabase
|
||||||
import android.os.Build
|
|
||||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||||
import dagger.hilt.android.testing.HiltAndroidTest
|
|
||||||
import dagger.hilt.android.testing.HiltTestApplication
|
|
||||||
import io.github.wulkanowy.data.db.Converters
|
import io.github.wulkanowy.data.db.Converters
|
||||||
import io.github.wulkanowy.data.db.entities.Semester
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.threeten.bp.LocalDate.of
|
||||||
import org.robolectric.RobolectricTestRunner
|
|
||||||
import org.robolectric.annotation.Config
|
|
||||||
import java.time.LocalDate.of
|
|
||||||
import kotlin.test.assertFalse
|
import kotlin.test.assertFalse
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
@HiltAndroidTest
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
|
||||||
@Config(sdk = [Build.VERSION_CODES.O_MR1], application = HiltTestApplication::class)
|
|
||||||
class Migration13Test : AbstractMigrationTest() {
|
class Migration13Test : AbstractMigrationTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -36,7 +26,7 @@ class Migration13Test : AbstractMigrationTest() {
|
|||||||
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(3, students.size)
|
assertEquals(3, students.size)
|
||||||
|
|
||||||
@ -57,8 +47,6 @@ class Migration13Test : AbstractMigrationTest() {
|
|||||||
assertEquals("C", className)
|
assertEquals("C", className)
|
||||||
assertEquals("Publiczna szkoła Wulkanowego-fejka nr 2 w fakelog.cf", schoolName)
|
assertEquals("Publiczna szkoła Wulkanowego-fejka nr 2 w fakelog.cf", schoolName)
|
||||||
}
|
}
|
||||||
|
|
||||||
db.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -72,7 +60,7 @@ class Migration13Test : AbstractMigrationTest() {
|
|||||||
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(2, students.size)
|
assertEquals(2, students.size)
|
||||||
|
|
||||||
@ -87,30 +75,28 @@ class Migration13Test : AbstractMigrationTest() {
|
|||||||
assertEquals("", className)
|
assertEquals("", className)
|
||||||
assertEquals("Publiczna szkoła Wulkanowego-fejka nr 1 w fakelog.cf", schoolName)
|
assertEquals("Publiczna szkoła Wulkanowego-fejka nr 1 w fakelog.cf", schoolName)
|
||||||
}
|
}
|
||||||
|
|
||||||
db.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun markAtLeastAndOnlyOneSemesterAtCurrent() {
|
fun markAtLeastAndOnlyOneSemesterAtCurrent() {
|
||||||
helper.createDatabase(dbName, 12).apply {
|
helper.createDatabase(dbName, 12).apply {
|
||||||
createStudent(this, 1, "", 5)
|
createStudent(this, 1, "", 5)
|
||||||
createSemester(this, 1, 1, 1, false)
|
createSemester(this, 1, 5, 1, 1, false)
|
||||||
createSemester(this, 1, 2, 1, false)
|
createSemester(this, 1, 5, 2, 1, false)
|
||||||
createSemester(this, 1, 3, 2, false)
|
createSemester(this, 1, 5, 3, 2, false)
|
||||||
createSemester(this, 1, 4, 2, false)
|
createSemester(this, 1, 5, 4, 2, false)
|
||||||
|
|
||||||
createStudent(this, 2, "", 5)
|
createStudent(this, 2, "", 5)
|
||||||
createSemester(this, 2, 5, 5, true)
|
createSemester(this, 2, 5, 5, 5, true)
|
||||||
createSemester(this, 2, 6, 5, true)
|
createSemester(this, 2, 5, 6, 5, true)
|
||||||
createSemester(this, 2, 7, 55, true)
|
createSemester(this, 2, 5, 7, 55, true)
|
||||||
createSemester(this, 2, 8, 55, true)
|
createSemester(this, 2, 5, 8, 55, true)
|
||||||
|
|
||||||
createStudent(this, 3, "", 5)
|
createStudent(this, 3, "", 5)
|
||||||
createSemester(this, 3, 11, 99, false)
|
createSemester(this, 3, 5, 11, 99, false)
|
||||||
createSemester(this, 3, 12, 99, false)
|
createSemester(this, 3, 5, 12, 99, false)
|
||||||
createSemester(this, 3, 13, 100, false)
|
createSemester(this, 3, 5, 13, 100, false)
|
||||||
createSemester(this, 3, 14, 100, true)
|
createSemester(this, 3, 5, 14, 100, true)
|
||||||
close()
|
close()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,50 +120,46 @@ class Migration13Test : AbstractMigrationTest() {
|
|||||||
assertEquals(2, first.diaryId)
|
assertEquals(2, first.diaryId)
|
||||||
}
|
}
|
||||||
|
|
||||||
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { semesters ->
|
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let {
|
||||||
assertTrue { semesters.single { it.second }.second }
|
assertTrue { it.single { it.second }.second }
|
||||||
assertEquals(1970, semesters[0].first.schoolYear)
|
assertEquals(1970, it[0].first.schoolYear)
|
||||||
assertEquals(of(1970, 1, 1), semesters[0].first.end)
|
assertEquals(of(1970, 1, 1), it[0].first.end)
|
||||||
assertEquals(of(1970, 1, 1), semesters[0].first.start)
|
assertEquals(of(1970, 1, 1), it[0].first.start)
|
||||||
assertFalse(semesters[0].second)
|
assertFalse(it[0].second)
|
||||||
assertFalse(semesters[1].second)
|
assertFalse(it[1].second)
|
||||||
assertFalse(semesters[2].second)
|
assertFalse(it[2].second)
|
||||||
assertTrue(semesters[3].second)
|
assertTrue(it[3].second)
|
||||||
}
|
}
|
||||||
|
|
||||||
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { semesters ->
|
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let {
|
||||||
assertTrue { semesters.single { it.second }.second }
|
assertTrue { it.single { it.second }.second }
|
||||||
assertFalse(semesters[0].second)
|
assertFalse(it[0].second)
|
||||||
assertFalse(semesters[1].second)
|
assertFalse(it[1].second)
|
||||||
assertFalse(semesters[2].second)
|
assertFalse(it[2].second)
|
||||||
assertTrue(semesters[3].second)
|
assertTrue(it[3].second)
|
||||||
}
|
}
|
||||||
db.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getSemesters(db: SupportSQLiteDatabase, query: String): List<Pair<Semester, Boolean>> {
|
private fun getSemesters(db: SupportSQLiteDatabase, query: String): List<Pair<Semester, Boolean>> {
|
||||||
val semesters = mutableListOf<Pair<Semester, Boolean>>()
|
val semesters = mutableListOf<Pair<Semester, Boolean>>()
|
||||||
|
|
||||||
db.query(query).use {
|
val cursor = db.query(query)
|
||||||
if (it.moveToFirst()) {
|
if (cursor.moveToFirst()) {
|
||||||
do {
|
do {
|
||||||
semesters.add(Semester(
|
semesters.add(Semester(
|
||||||
studentId = it.getInt(1),
|
studentId = cursor.getInt(1),
|
||||||
diaryId = it.getInt(2),
|
diaryId = cursor.getInt(2),
|
||||||
kindergartenDiaryId = 0,
|
diaryName = cursor.getString(3),
|
||||||
diaryName = it.getString(3),
|
semesterId = cursor.getInt(4),
|
||||||
semesterId = it.getInt(4),
|
semesterName = cursor.getInt(5),
|
||||||
semesterName = it.getInt(5),
|
classId = cursor.getInt(7),
|
||||||
classId = it.getInt(7),
|
unitId = cursor.getInt(8),
|
||||||
unitId = it.getInt(8),
|
schoolYear = cursor.getInt(9),
|
||||||
schoolYear = it.getInt(9),
|
start = Converters().timestampToDate(cursor.getLong(10))!!,
|
||||||
start = Converters().timestampToLocalDate(it.getLong(10))!!,
|
end = Converters().timestampToDate(cursor.getLong(11))!!
|
||||||
end = Converters().timestampToLocalDate(it.getLong(11))!!
|
) to (cursor.getInt(6) == 1))
|
||||||
) to (it.getInt(6) == 1))
|
} while (cursor.moveToNext())
|
||||||
} while (it.moveToNext())
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return semesters.toList()
|
return semesters.toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,13 +180,7 @@ class Migration13Test : AbstractMigrationTest() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createSemester(
|
private fun createSemester(db: SupportSQLiteDatabase, studentId: Int, classId: Int, semesterId: Int, diaryId: Int, isCurrent: Boolean = false) {
|
||||||
db: SupportSQLiteDatabase,
|
|
||||||
studentId: Int,
|
|
||||||
semesterId: Int,
|
|
||||||
diaryId: Int,
|
|
||||||
isCurrent: Boolean = false
|
|
||||||
) {
|
|
||||||
db.insert("Semesters", SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply {
|
db.insert("Semesters", SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply {
|
||||||
put("student_id", studentId)
|
put("student_id", studentId)
|
||||||
put("diary_id", diaryId)
|
put("diary_id", diaryId)
|
||||||
@ -212,7 +188,7 @@ class Migration13Test : AbstractMigrationTest() {
|
|||||||
put("semester_id", semesterId)
|
put("semester_id", semesterId)
|
||||||
put("semester_name", "1")
|
put("semester_name", "1")
|
||||||
put("is_current", isCurrent)
|
put("is_current", isCurrent)
|
||||||
put("class_id", 5)
|
put("class_id", classId)
|
||||||
put("unit_id", "99")
|
put("unit_id", "99")
|
||||||
})
|
})
|
||||||
}
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
|
||||||
|
fun getStudent(): Student {
|
||||||
|
return Student(
|
||||||
|
email = "test",
|
||||||
|
password = "test123",
|
||||||
|
schoolSymbol = "23",
|
||||||
|
scrapperBaseUrl = "fakelog.cf",
|
||||||
|
loginType = "AUTO",
|
||||||
|
isCurrent = true,
|
||||||
|
studentName = "",
|
||||||
|
schoolShortName = "",
|
||||||
|
schoolName = "",
|
||||||
|
studentId = 0,
|
||||||
|
classId = 1,
|
||||||
|
symbol = "",
|
||||||
|
registrationDate = LocalDateTime.now(),
|
||||||
|
className = "",
|
||||||
|
loginMode = "API",
|
||||||
|
certificateKey = "",
|
||||||
|
privateKey = "",
|
||||||
|
mobileBaseUrl = "",
|
||||||
|
userLoginId = 0,
|
||||||
|
isParent = false
|
||||||
|
)
|
||||||
|
}
|
19
app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt
Normal file
19
app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories
|
||||||
|
|
||||||
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingStrategy
|
||||||
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.error.ErrorHandler
|
||||||
|
import io.reactivex.Observable
|
||||||
|
import io.reactivex.Single
|
||||||
|
|
||||||
|
class TestInternetObservingStrategy : InternetObservingStrategy {
|
||||||
|
|
||||||
|
override fun checkInternetConnectivity(host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Single<Boolean> {
|
||||||
|
return Single.just(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun observeInternetConnectivity(initialIntervalInMs: Int, intervalInMs: Int, host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Observable<Boolean> {
|
||||||
|
return Observable.just(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getDefaultPingHost() = "localhost"
|
||||||
|
}
|
53
app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt
Normal file
53
app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.attendance
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Attendance
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate.now
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class AttendanceLocalTest {
|
||||||
|
|
||||||
|
private lateinit var attendanceLocal: AttendanceLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java).build()
|
||||||
|
attendanceLocal = AttendanceLocal(testDb.attendanceDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
attendanceLocal.saveAttendance(listOf(
|
||||||
|
Attendance(1, 2, 3, of(2018, 9, 10), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.ACCEPTED.name),
|
||||||
|
Attendance(1, 2, 3, of(2018, 9, 14), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.WAITING.name),
|
||||||
|
Attendance(1, 2, 3, of(2018, 9, 17), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.ACCEPTED.name)
|
||||||
|
))
|
||||||
|
|
||||||
|
val attendance = attendanceLocal
|
||||||
|
.getAttendance(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1),
|
||||||
|
of(2018, 9, 10),
|
||||||
|
of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, attendance.size)
|
||||||
|
assertEquals(attendance[0].date, of(2018, 9, 10))
|
||||||
|
assertEquals(attendance[1].date, of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
}
|
59
app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt
Normal file
59
app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.completedlessons
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.CompletedLesson
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import org.threeten.bp.LocalDate.now
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class CompletedLessonsLocalTest {
|
||||||
|
|
||||||
|
private lateinit var completedLessonsLocal: CompletedLessonsLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
completedLessonsLocal = CompletedLessonsLocal(testDb.completedLessonsDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
completedLessonsLocal.saveCompletedLessons(listOf(
|
||||||
|
getCompletedLesson(of(2018, 9, 10), 1),
|
||||||
|
getCompletedLesson(of(2018, 9, 14), 2),
|
||||||
|
getCompletedLesson(of(2018, 9, 17), 3)
|
||||||
|
))
|
||||||
|
|
||||||
|
val completed = completedLessonsLocal
|
||||||
|
.getCompletedLessons(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1),
|
||||||
|
of(2018, 9, 10),
|
||||||
|
of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, completed.size)
|
||||||
|
assertEquals(completed[0].date, of(2018, 9, 10))
|
||||||
|
assertEquals(completed[1].date, of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getCompletedLesson(date: LocalDate, number: Int): CompletedLesson {
|
||||||
|
return CompletedLesson(1, 2, date, number, "", "", "", "", "", "", "")
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.exam
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Exam
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate.now
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class ExamLocalTest {
|
||||||
|
|
||||||
|
private lateinit var examLocal: ExamLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java).build()
|
||||||
|
examLocal = ExamLocal(testDb.examsDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
examLocal.saveExams(listOf(
|
||||||
|
Exam(1, 2, of(2018, 9, 10), now(), "", "", "", "", "", ""),
|
||||||
|
Exam(1, 2, of(2018, 9, 14), now(), "", "", "", "", "", ""),
|
||||||
|
Exam(1, 2, of(2018, 9, 17), now(), "", "", "", "", "", "")
|
||||||
|
))
|
||||||
|
|
||||||
|
val exams = examLocal
|
||||||
|
.getExams(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1),
|
||||||
|
of(2018, 9, 10),
|
||||||
|
of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, exams.size)
|
||||||
|
assertEquals(exams[0].date, of(2018, 9, 10))
|
||||||
|
assertEquals(exams[1].date, of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
}
|
53
app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt
Normal file
53
app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.grade
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import org.threeten.bp.LocalDate.now
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class GradeLocalTest {
|
||||||
|
|
||||||
|
private lateinit var gradeLocal: GradeLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
gradeLocal = GradeLocal(testDb.gradeDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, LocalDate.of(2018, 9, 10), "", 1),
|
||||||
|
createGradeLocal(4, 4.0, LocalDate.of(2019, 2, 27), "", 2),
|
||||||
|
createGradeLocal(3, 5.0, LocalDate.of(2019, 2, 28), "", 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val semester = Semester(1, 2, "", 2019, 2, 1, now(), now(), 1, 1)
|
||||||
|
|
||||||
|
val grades = gradeLocal
|
||||||
|
.getGrades(semester)
|
||||||
|
.blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, grades.size)
|
||||||
|
assertEquals(grades[0].date, LocalDate.of(2019, 2, 27))
|
||||||
|
assertEquals(grades[1].date, LocalDate.of(2019, 2, 28))
|
||||||
|
}
|
||||||
|
}
|
181
app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt
Normal file
181
app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.grade
|
||||||
|
|
||||||
|
import android.os.Build.VERSION_CODES.P
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider.getApplicationContext
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.SdkSuppress
|
||||||
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
import io.mockk.MockKAnnotations
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.impl.annotations.MockK
|
||||||
|
import io.reactivex.Single
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFalse
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
@SdkSuppress(minSdkVersion = P)
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class GradeRepositoryTest {
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var mockSdk: Sdk
|
||||||
|
|
||||||
|
private val settings = InternetObservingSettings.builder()
|
||||||
|
.strategy(TestInternetObservingStrategy())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var semesterMock: Semester
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var studentMock: Student
|
||||||
|
|
||||||
|
private lateinit var gradeRemote: GradeRemote
|
||||||
|
|
||||||
|
private lateinit var gradeLocal: GradeLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun initApi() {
|
||||||
|
MockKAnnotations.init(this)
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build()
|
||||||
|
gradeLocal = GradeLocal(testDb.gradeDao)
|
||||||
|
gradeRemote = GradeRemote(mockSdk)
|
||||||
|
|
||||||
|
every { studentMock.registrationDate } returns LocalDateTime.of(2019, 2, 27, 12, 0)
|
||||||
|
every { semesterMock.studentId } returns 1
|
||||||
|
every { semesterMock.diaryId } returns 1
|
||||||
|
every { semesterMock.schoolYear } returns 2019
|
||||||
|
every { semesterMock.semesterId } returns 1
|
||||||
|
every { mockSdk.switchDiary(any(), any()) } returns mockSdk
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun markOlderThanRegisterDateAsRead() {
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 4.0, of(2019, 2, 25), "Ocena pojawiła się"),
|
||||||
|
createGradeApi(5, 4.0, of(2019, 2, 26), "przed zalogowanie w aplikacji"),
|
||||||
|
createGradeApi(5, 4.0, of(2019, 2, 27), "Ocena z dnia logowania"),
|
||||||
|
createGradeApi(5, 4.0, of(2019, 2, 28), "Ocena jeszcze nowsza")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date }
|
||||||
|
|
||||||
|
assertFalse { grades[0].isRead }
|
||||||
|
assertFalse { grades[1].isRead }
|
||||||
|
assertTrue { grades[2].isRead }
|
||||||
|
assertTrue { grades[3].isRead }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun mitigateOldGradesNotifications() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Jedna ocena"),
|
||||||
|
createGradeLocal(4, 4.0, of(2019, 2, 26), "Druga"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 27), "Trzecia")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 2.0, of(2019, 2, 25), "Ocena ma datę, jest inna, ale nie zostanie powiadomiona"),
|
||||||
|
createGradeApi(4, 3.0, of(2019, 2, 26), "starszą niż ostatnia lokalnie"),
|
||||||
|
createGradeApi(3, 4.0, of(2019, 2, 27), "Ta jest z tego samego dnia co ostatnia lokalnie"),
|
||||||
|
createGradeApi(2, 5.0, of(2019, 2, 28), "Ta jest już w ogóle nowa")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date }
|
||||||
|
|
||||||
|
assertFalse { grades[0].isRead }
|
||||||
|
assertFalse { grades[1].isRead }
|
||||||
|
assertTrue { grades[2].isRead }
|
||||||
|
assertTrue { grades[3].isRead }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun subtractLocaleDuplicateGrades() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, grades.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun subtractRemoteDuplicateGrades() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(3, grades.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun emptyLocal() {
|
||||||
|
gradeLocal.saveGrades(listOf())
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(3, grades.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun emptyRemote() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(0, grades.size)
|
||||||
|
}
|
||||||
|
}
|
41
app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt
Normal file
41
app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.grade
|
||||||
|
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import io.github.wulkanowy.sdk.pojo.Grade as GradeRemote
|
||||||
|
import io.github.wulkanowy.data.db.entities.Grade as GradeLocal
|
||||||
|
|
||||||
|
fun createGradeLocal(value: Int, weight: Double, date: LocalDate, desc: String, semesterId: Int = 1): GradeLocal {
|
||||||
|
return GradeLocal(
|
||||||
|
semesterId = semesterId,
|
||||||
|
studentId = 1,
|
||||||
|
modifier = .0,
|
||||||
|
teacher = "",
|
||||||
|
subject = "",
|
||||||
|
date = date,
|
||||||
|
color = "",
|
||||||
|
comment = "",
|
||||||
|
description = desc,
|
||||||
|
entry = "",
|
||||||
|
gradeSymbol = "",
|
||||||
|
value = value.toDouble(),
|
||||||
|
weight = "",
|
||||||
|
weightValue = weight
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createGradeApi(value: Int, weight: Double, date: LocalDate, desc: String): GradeRemote {
|
||||||
|
return GradeRemote(
|
||||||
|
subject = "",
|
||||||
|
color = "",
|
||||||
|
comment = "",
|
||||||
|
date = date,
|
||||||
|
description = desc,
|
||||||
|
entry = "",
|
||||||
|
modifier = .0,
|
||||||
|
symbol = "",
|
||||||
|
teacher = "",
|
||||||
|
value = value.toDouble(),
|
||||||
|
weight = weight.toString(),
|
||||||
|
weightValue = weight
|
||||||
|
)
|
||||||
|
}
|
106
app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt
Normal file
106
app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.gradestatistics
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.GradePointsStatistics
|
||||||
|
import io.github.wulkanowy.data.db.entities.GradeStatistics
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate.now
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class GradeStatisticsLocalTest {
|
||||||
|
|
||||||
|
private lateinit var gradeStatisticsLocal: GradeStatisticsLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
gradeStatisticsLocal = GradeStatisticsLocal(testDb.gradeStatistics, testDb.gradePointsStatistics)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_subject() {
|
||||||
|
gradeStatisticsLocal.saveGradesStatistics(listOf(
|
||||||
|
getGradeStatistics("Matematyka", 2, 1),
|
||||||
|
getGradeStatistics("Fizyka", 1, 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Matematyka").blockingGet()
|
||||||
|
assertEquals(1, stats.size)
|
||||||
|
assertEquals(stats[0].subject, "Matematyka")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_all() {
|
||||||
|
gradeStatisticsLocal.saveGradesStatistics(listOf(
|
||||||
|
getGradeStatistics("Matematyka", 2, 1),
|
||||||
|
getGradeStatistics("Chemia", 2, 1),
|
||||||
|
getGradeStatistics("Fizyka", 1, 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Wszystkie").blockingGet()
|
||||||
|
assertEquals(3, stats.size)
|
||||||
|
assertEquals(stats[0].subject, "Wszystkie")
|
||||||
|
assertEquals(stats[1].subject, "Matematyka")
|
||||||
|
assertEquals(stats[2].subject, "Chemia")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_points() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf(
|
||||||
|
getGradePointsStatistics("Matematyka", 2, 1),
|
||||||
|
getGradePointsStatistics("Chemia", 2, 1),
|
||||||
|
getGradePointsStatistics("Fizyka", 1, 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet()
|
||||||
|
with(stats[0]) {
|
||||||
|
assertEquals(subject, "Matematyka")
|
||||||
|
assertEquals(others, 5.0)
|
||||||
|
assertEquals(student, 5.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_subjectEmpty() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf())
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet()
|
||||||
|
assertEquals(null, stats)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_allEmpty() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf())
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Wszystkie").blockingGet()
|
||||||
|
assertEquals(null, stats)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSemester(): Semester {
|
||||||
|
return Semester(2, 2, "", 2019, 1, 2, now(), now(), 1, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getGradeStatistics(subject: String, studentId: Int, semesterId: Int): GradeStatistics {
|
||||||
|
return GradeStatistics(studentId, semesterId, subject, 5, 5, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getGradePointsStatistics(subject: String, studentId: Int, semesterId: Int): GradePointsStatistics {
|
||||||
|
return GradePointsStatistics(studentId, semesterId, subject, 5.0, 5.0)
|
||||||
|
}
|
||||||
|
}
|
49
app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt
Normal file
49
app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.luckynumber
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import org.threeten.bp.LocalDateTime.now
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class LuckyNumberLocalTest {
|
||||||
|
|
||||||
|
private lateinit var luckyNumberLocal: LuckyNumberLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
luckyNumberLocal = LuckyNumberLocal(testDb.luckyNumberDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
luckyNumberLocal.saveLuckyNumber(LuckyNumber(1, LocalDate.of(2019, 1, 20), 14))
|
||||||
|
|
||||||
|
val luckyNumber = luckyNumberLocal.getLuckyNumber(Student("", "", "", "", "", "", false, "", "", "", 1, 1, "", "", "", "", "", 1, false, now()),
|
||||||
|
LocalDate.of(2019, 1, 20)
|
||||||
|
).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(1, luckyNumber.studentId)
|
||||||
|
assertEquals(LocalDate.of(2019, 1, 20), luckyNumber.date)
|
||||||
|
assertEquals(14, luckyNumber.luckyNumber)
|
||||||
|
}
|
||||||
|
}
|
60
app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt
Normal file
60
app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.recipient
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Recipient
|
||||||
|
import io.github.wulkanowy.data.db.entities.ReportingUnit
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class RecipientLocalTest {
|
||||||
|
|
||||||
|
private lateinit var recipientLocal: RecipientLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
recipientLocal = RecipientLocal(testDb.recipientDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
recipientLocal.saveRecipients(listOf(
|
||||||
|
Recipient(1, "2rPracownik", "Kowalski Jan", "Kowalski Jan [KJ] - Pracownik (Fake123456)", 3, 4, 2, "hash"),
|
||||||
|
Recipient(1, "3rPracownik", "Kowalska Karolina", "Kowalska Karolina [KK] - Pracownik (Fake123456)", 4, 4, 2, "hash"),
|
||||||
|
Recipient(1, "4rPracownik", "Krupa Stanisław", "Krupa Stanisław [KS] - Uczeń (Fake123456)", 5, 4, 1, "hash")
|
||||||
|
))
|
||||||
|
|
||||||
|
val recipients = recipientLocal.getRecipients(
|
||||||
|
Student("fakelog.cf", "AUTO", "", "", "", "", false, "", "", "", 1, 0, "", "", "", "", "", 1, true, LocalDateTime.now()),
|
||||||
|
2,
|
||||||
|
ReportingUnit(1, 4, "", 0, "", emptyList())
|
||||||
|
).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, recipients.size)
|
||||||
|
assertEquals(1, recipients[0].studentId)
|
||||||
|
assertEquals("3rPracownik", recipients[1].realId)
|
||||||
|
assertEquals("Kowalski Jan", recipients[0].name)
|
||||||
|
assertEquals("Kowalska Karolina [KK] - Pracownik (Fake123456)", recipients[1].realName)
|
||||||
|
assertEquals(3, recipients[0].loginId)
|
||||||
|
assertEquals(4, recipients[1].unitId)
|
||||||
|
assertEquals(2, recipients[0].role)
|
||||||
|
assertEquals("hash", recipients[1].hash)
|
||||||
|
}
|
||||||
|
}
|
44
app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt
Normal file
44
app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.student
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.repositories.getStudent
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class StudentLocalTest {
|
||||||
|
|
||||||
|
private lateinit var studentLocal: StudentLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
private val student = getStudent()
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
studentLocal = StudentLocal(testDb.studentDao, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
studentLocal.saveStudents(listOf(student)).blockingGet()
|
||||||
|
|
||||||
|
val student = studentLocal.getCurrentStudent(true).blockingGet()
|
||||||
|
assertEquals("23", student.schoolSymbol)
|
||||||
|
}
|
||||||
|
}
|
48
app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt
Normal file
48
app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.timetable
|
||||||
|
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
import org.threeten.bp.LocalDateTime.now
|
||||||
|
import io.github.wulkanowy.data.db.entities.Timetable as TimetableLocal
|
||||||
|
import io.github.wulkanowy.sdk.pojo.Timetable as TimetableRemote
|
||||||
|
|
||||||
|
fun createTimetableLocal(start: LocalDateTime, number: Int, room: String = "", subject: String = "", teacher: String = "", changes: Boolean = false): TimetableLocal {
|
||||||
|
return TimetableLocal(
|
||||||
|
studentId = 1,
|
||||||
|
diaryId = 2,
|
||||||
|
number = number,
|
||||||
|
start = start,
|
||||||
|
end = now(),
|
||||||
|
date = start.toLocalDate(),
|
||||||
|
subject = subject,
|
||||||
|
subjectOld = "",
|
||||||
|
group = "",
|
||||||
|
room = room,
|
||||||
|
roomOld = "",
|
||||||
|
teacher = teacher,
|
||||||
|
teacherOld = "",
|
||||||
|
info = "",
|
||||||
|
isStudentPlan = true,
|
||||||
|
changes = changes,
|
||||||
|
canceled = false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createTimetableRemote(start: LocalDateTime, number: Int = 1, room: String = "", subject: String = "", teacher: String = "", changes: Boolean = false): TimetableRemote {
|
||||||
|
return TimetableRemote(
|
||||||
|
number = number,
|
||||||
|
start = start,
|
||||||
|
end = start.plusMinutes(45),
|
||||||
|
date = start.toLocalDate(),
|
||||||
|
subject = subject,
|
||||||
|
group = "",
|
||||||
|
room = room,
|
||||||
|
teacher = teacher,
|
||||||
|
info = "",
|
||||||
|
changes = changes,
|
||||||
|
canceled = false,
|
||||||
|
roomOld = "",
|
||||||
|
subjectOld = "",
|
||||||
|
teacherOld = "",
|
||||||
|
studentPlan = true
|
||||||
|
)
|
||||||
|
}
|
53
app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt
Normal file
53
app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.timetable
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import org.threeten.bp.LocalDateTime.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class TimetableLocalTest {
|
||||||
|
|
||||||
|
private lateinit var timetableDb: TimetableLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
timetableDb = TimetableLocal(testDb.timetableDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
timetableDb.saveTimetable(listOf(
|
||||||
|
createTimetableLocal(of(2018, 9, 10, 0, 0, 0), 1),
|
||||||
|
createTimetableLocal(of(2018, 9, 14, 0, 0, 0), 1),
|
||||||
|
createTimetableLocal(of(2018, 9, 17, 0, 0, 0), 1)
|
||||||
|
))
|
||||||
|
|
||||||
|
val exams = timetableDb.getTimetable(
|
||||||
|
Semester(1, 2, "", 1, 1, 2019, LocalDate.now(), LocalDate.now(), 1, 1),
|
||||||
|
LocalDate.of(2018, 9, 10),
|
||||||
|
LocalDate.of(2018, 9, 14)
|
||||||
|
).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, exams.size)
|
||||||
|
assertEquals(exams[0].date, LocalDate.of(2018, 9, 10))
|
||||||
|
assertEquals(exams[1].date, LocalDate.of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
}
|
150
app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt
Normal file
150
app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories.timetable
|
||||||
|
|
||||||
|
import android.os.Build.VERSION_CODES.P
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider.getApplicationContext
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.SdkSuppress
|
||||||
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy
|
||||||
|
import io.github.wulkanowy.data.repositories.getStudent
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
import io.mockk.MockKAnnotations
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.impl.annotations.MockK
|
||||||
|
import io.reactivex.Single
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import org.threeten.bp.LocalDateTime.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@SdkSuppress(minSdkVersion = P)
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class TimetableRepositoryTest {
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var mockSdk: Sdk
|
||||||
|
|
||||||
|
private val settings = InternetObservingSettings.builder()
|
||||||
|
.strategy(TestInternetObservingStrategy())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
private val student = getStudent()
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var semesterMock: Semester
|
||||||
|
|
||||||
|
private lateinit var timetableRemote: TimetableRemote
|
||||||
|
|
||||||
|
private lateinit var timetableLocal: TimetableLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun initApi() {
|
||||||
|
MockKAnnotations.init(this)
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build()
|
||||||
|
timetableLocal = TimetableLocal(testDb.timetableDao)
|
||||||
|
timetableRemote = TimetableRemote(mockSdk)
|
||||||
|
|
||||||
|
every { semesterMock.studentId } returns 1
|
||||||
|
every { semesterMock.diaryId } returns 2
|
||||||
|
every { semesterMock.schoolYear } returns 2019
|
||||||
|
every { semesterMock.semesterId } returns 1
|
||||||
|
every { mockSdk.switchDiary(any(), any()) } returns mockSdk
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun copyRoomToCompletedFromPrevious() {
|
||||||
|
timetableLocal.saveTimetable(listOf(
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 8, 0), 1, "123", "Przyroda"),
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 8, 50), 2, "321", "Religia"),
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 9, 40), 3, "213", "W-F"),
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 10, 30),3, "213", "W-F", "Jan Kowalski")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf(
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 8, 0), 1, "", "Przyroda"),
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 8, 50), 2, "", "Religia"),
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 9, 40), 3, "", "W-F"),
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 10, 30), 4, "", "W-F")
|
||||||
|
))
|
||||||
|
|
||||||
|
val lessons = TimetableRepository(settings, timetableLocal, timetableRemote)
|
||||||
|
.getTimetable(student, semesterMock, LocalDate.of(2019, 3, 5), LocalDate.of(2019, 3, 5), true)
|
||||||
|
.blockingGet()
|
||||||
|
|
||||||
|
assertEquals(4, lessons.size)
|
||||||
|
assertEquals("123", lessons[0].room)
|
||||||
|
assertEquals("321", lessons[1].room)
|
||||||
|
assertEquals("213", lessons[2].room)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun copyTeacherToCompletedFromPrevious() {
|
||||||
|
timetableLocal.saveTimetable(listOf(
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Paweł Poniedziałkowski", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Wtorkowska", true),
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true),
|
||||||
|
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 8, 0), 1, "123", "Język polski", "Joanna Wtorkowska", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 8, 50), 2, "124", "Język polski", "Joanna Wtorkowska", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 9, 40), 3, "125", "Język polski", "Joanna Środowska", true),
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 10, 40), 4, "126", "Język polski", "Joanna Środowska", true),
|
||||||
|
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 8, 0), 1, "123", "Matematyka", "", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "", true),
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "", true)
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf(
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Jakub Wtorkowski", true),
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Poniedziałkowska", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true),
|
||||||
|
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 8, 0), 1, "123", "Język polski", "", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 8, 50), 2, "124", "Język polski", "", true),
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 9, 40), 3, "125", "Język polski", "", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 10, 40), 4, "126", "Język polski", "", true),
|
||||||
|
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 8, 0), 1, "123", "Matematyka", "Paweł Środowski", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "Paweł Czwartkowski", true),
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "Paweł Środowski", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true)
|
||||||
|
))
|
||||||
|
|
||||||
|
val lessons = TimetableRepository(settings, timetableLocal, timetableRemote)
|
||||||
|
.getTimetable(student, semesterMock, LocalDate.of(2019, 12, 23), LocalDate.of(2019, 12, 25), true)
|
||||||
|
.blockingGet()
|
||||||
|
|
||||||
|
assertEquals(12, lessons.size)
|
||||||
|
|
||||||
|
assertEquals("Paweł Poniedziałkowski", lessons[0].teacher)
|
||||||
|
assertEquals("Jakub Wtorkowski", lessons[1].teacher)
|
||||||
|
assertEquals("Joanna Poniedziałkowska", lessons[2].teacher)
|
||||||
|
assertEquals("Joanna Wtorkowska", lessons[3].teacher)
|
||||||
|
|
||||||
|
assertEquals("Joanna Wtorkowska", lessons[4].teacher)
|
||||||
|
assertEquals("", lessons[5].teacher)
|
||||||
|
assertEquals("", lessons[6].teacher)
|
||||||
|
assertEquals("", lessons[7].teacher)
|
||||||
|
|
||||||
|
assertEquals("Paweł Środowski", lessons[8].teacher)
|
||||||
|
assertEquals("Paweł Czwartkowski", lessons[9].teacher)
|
||||||
|
assertEquals("Paweł Środowski", lessons[10].teacher)
|
||||||
|
assertEquals("Paweł Czwartkowski", lessons[11].teacher)
|
||||||
|
}
|
||||||
|
}
|
@ -14,37 +14,34 @@ import kotlin.test.assertFailsWith
|
|||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
class ScramblerTest {
|
class ScramblerTest {
|
||||||
|
|
||||||
private val scrambler = Scrambler(ApplicationProvider.getApplicationContext())
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun encryptDecryptTest() {
|
fun encryptDecryptTest() {
|
||||||
assertEquals(
|
assertEquals("TEST", decrypt(encrypt("TEST",
|
||||||
"TEST", scrambler.decrypt(scrambler.encrypt("TEST"))
|
ApplicationProvider.getApplicationContext())))
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun emptyTextEncryptTest() {
|
fun emptyTextEncryptTest() {
|
||||||
assertFailsWith<ScramblerException> {
|
assertFailsWith<ScramblerException> {
|
||||||
scrambler.decrypt("")
|
decrypt("")
|
||||||
}
|
}
|
||||||
|
|
||||||
assertFailsWith<ScramblerException> {
|
assertFailsWith<ScramblerException> {
|
||||||
scrambler.encrypt("")
|
encrypt("", ApplicationProvider.getApplicationContext())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SdkSuppress(minSdkVersion = 18)
|
@SdkSuppress(minSdkVersion = 18)
|
||||||
fun emptyKeyStoreTest() {
|
fun emptyKeyStoreTest() {
|
||||||
val text = scrambler.encrypt("test")
|
val text = encrypt("test", ApplicationProvider.getApplicationContext())
|
||||||
|
|
||||||
val keyStore = KeyStore.getInstance("AndroidKeyStore")
|
val keyStore = KeyStore.getInstance("AndroidKeyStore")
|
||||||
keyStore.load(null)
|
keyStore.load(null)
|
||||||
keyStore.deleteEntry("wulkanowy_password")
|
keyStore.deleteEntry("wulkanowy_password")
|
||||||
|
|
||||||
assertFailsWith<ScramblerException> {
|
assertFailsWith<ScramblerException> {
|
||||||
scrambler.decrypt(text)
|
decrypt(text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,37 +36,6 @@
|
|||||||
"status": 2
|
"status": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"client_info": {
|
|
||||||
"mobilesdk_app_id": "1:1091101852179:android:b558a25f65d088b1",
|
|
||||||
"android_client_info": {
|
|
||||||
"package_name": "io.github.wulkanowy"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"oauth_client": [
|
|
||||||
{
|
|
||||||
"client_id": "",
|
|
||||||
"client_type": 3
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"api_key": [
|
|
||||||
{
|
|
||||||
"current_key": ""
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"services": {
|
|
||||||
"analytics_service": {
|
|
||||||
"status": 1
|
|
||||||
},
|
|
||||||
"appinvite_service": {
|
|
||||||
"status": 1,
|
|
||||||
"other_platform_oauth_client": []
|
|
||||||
},
|
|
||||||
"ads_service": {
|
|
||||||
"status": 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"configuration_version": "1"
|
"configuration_version": "1"
|
0
app/src/debug/res/drawable/ic_stat_note.xml → app/src/debug/res/drawable-anydpi-v24/ic_stat_note.xml
0
app/src/debug/res/drawable/ic_stat_note.xml → app/src/debug/res/drawable-anydpi-v24/ic_stat_note.xml
BIN
app/src/debug/res/drawable-hdpi/ic_stat_grade.png
Normal file
BIN
app/src/debug/res/drawable-hdpi/ic_stat_grade.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 478 B |
BIN
app/src/debug/res/drawable-hdpi/ic_stat_luckynumber.png
Normal file
BIN
app/src/debug/res/drawable-hdpi/ic_stat_luckynumber.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 652 B |
BIN
app/src/debug/res/drawable-hdpi/ic_stat_message.png
Normal file
BIN
app/src/debug/res/drawable-hdpi/ic_stat_message.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 384 B |
BIN
app/src/debug/res/drawable-hdpi/ic_stat_note.png
Normal file
BIN
app/src/debug/res/drawable-hdpi/ic_stat_note.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 460 B |
BIN
app/src/debug/res/drawable-mdpi/ic_stat_grade.png
Normal file
BIN
app/src/debug/res/drawable-mdpi/ic_stat_grade.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 355 B |
BIN
app/src/debug/res/drawable-mdpi/ic_stat_luckynumber.png
Normal file
BIN
app/src/debug/res/drawable-mdpi/ic_stat_luckynumber.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 451 B |
BIN
app/src/debug/res/drawable-mdpi/ic_stat_message.png
Normal file
BIN
app/src/debug/res/drawable-mdpi/ic_stat_message.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 297 B |
BIN
app/src/debug/res/drawable-mdpi/ic_stat_note.png
Normal file
BIN
app/src/debug/res/drawable-mdpi/ic_stat_note.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 339 B |
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_grade.png
Normal file
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_grade.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 588 B |
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_luckynumber.png
Normal file
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_luckynumber.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 897 B |
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_message.png
Normal file
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_message.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 508 B |
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_note.png
Normal file
BIN
app/src/debug/res/drawable-xhdpi/ic_stat_note.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 586 B |
BIN
app/src/debug/res/drawable-xxhdpi/ic_stat_grade.png
Normal file
BIN
app/src/debug/res/drawable-xxhdpi/ic_stat_grade.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 781 B |
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user