Compare commits

..

No commits in common. "main" and "0.1.0-alpha.15" have entirely different histories.

13 changed files with 105 additions and 276 deletions

View file

@ -16,14 +16,10 @@ assignees: hernikplays
- [ ] ziskejJidelnicek
- [ ] jidelnicekDen
- [ ] objednat
- [ ] doBurzy
- [ ] objednatZBurzy
- [ ] ziskatBurzu
- [ ] ziskejUzivatele
**V případě nefunkčnosti některé z metod vkládejte sem chybové hlášky a váš kód**
*Příklad:*
- *chybová hláška pro `login`*
- *chybová hláška pro `jidelnicekDen`*
- *chybová hláška pro `objednat`*
- *chybová hláška pro `objednat`*

View file

@ -1,42 +0,0 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Dart check
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# Note: This workflow uses the latest stable version of the Dart SDK.
# You can specify other versions if desired, see documentation here:
# https://github.com/dart-lang/setup-dart/blob/main/README.md
# - uses: dart-lang/setup-dart@v1
- uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603
- name: Install dependencies
run: dart pub get
# Uncomment this step to verify the use of 'dart format' on each commit.
# - name: Verify formatting
# run: dart format --output=none --set-exit-if-changed .
# Consider passing '--fatal-infos' for slightly stricter analysis.
- name: Analyze project source
run: dart analyze
# Your project will need to have tests in test/ and a dependency on
# package:test for this step to succeed. Note that Flutter projects will
# want to change this to 'flutter test'.
#- name: Run tests
# run: dart test

4
.gitignore vendored
View file

@ -9,6 +9,4 @@ build/
# https://dart.dev/guides/libraries/private-files#pubspeclock.
pubspec.lock
.env*
*.test.dart
node_modules/
*.test.dart

View file

@ -1,5 +1,3 @@
.env
test
*.test.dart
node_modules
package*.json
*.test.dart

View file

@ -1,27 +1,3 @@
## 2.0.0
- Alergeny jsou nyní ve tříde `Alergen`
- Opravena chyba, kdy se HTML alergenů propisovalo do názvu jídla
## 1.1.4
- Opravit info o stavu na burze
## 1.1.3
- Opravit hledání burza URL u jídelen, kde je tlačítko ve tvaru `X ks do burzy`
## 1.1.2
- Opravit negativní čísla v kreditu, účet pro platby by @tpkowastaken in https://github.com/hernikplays/canteenlib/pull/4
## 1.1.1
- Opravit problém s burzou
## 1.1.0-alpha.1
- Experimentální podpora pro SPŠEI Ostrava
- Hezčí kód
- Alergeny
## 1.0.1
- změnit získávání názvu jídla
## 1.0.0
- Stabilizace
## 0.1.0-alpha.17
- Debug informace v `objednatZBurzy`
## 0.1.0-alpha.16
- Opravit zobrazení zda-li jde jídlo objednat, když není objednané žádné jídlo
## 0.1.0-alpha.15
- Úprava nakládání s chybami v `_getRequest`
- `fail` je chyba

View file

@ -3,16 +3,13 @@ V následující tabulce naleznete instance iCanteen, které byly testovány pro
Výchozí verze, pro kterou aktuálně je knihovna tvořena, je **2.18.19**
Kantýny, které v adrese obsahují i číslo portu, dokážou být často problémové.
- ❌ - nefunkční nebo netestováno
- ✅ - plně funkční nebo pouze s malými chybami
- ❓ - částečně funkční
| Provozovatel | Verze iCanteen | Funkční | Verze knihovny | Adresa |
|:--------------:|------------------|---------|----------------|---------|
| SŠTE Brno | iCanteen 2.19.13 | ✅ | 2.0.0 | https://stravovani.sstebrno.cz
| SPŠ Třebíč | iCanteen 2.10.25 | ❌ | 0.1.0-alpha | https://icanteen.spst.cz
| SPŠEI Ostrava | iCanteen 2.17.03 | ❌ [zde](https://git.mnau.xyz/hernik/canteenlib/issues/2) | 1.0.1 | https://obedy.spseiostrava.cz:8443/
| Provozovatel | Verze iCanteen | Funkční | Verze knihovny |
|:--------------:|------------------|---------|----------------|
| SŠTE Brno | iCanteen 2.18.19 | ✅ | 0.1.0-alpha.7 |
| SPŠ Třebíč | iCanteen 2.10.25 | ❓ | 0.1.0-alpha |
Pokud chcete přispět s testem, otestujte tuto knihovnu na instanci iCanteen, kde, nejlépe legálně, máte přístup, a nahlašte své poznatky [zde](https://git.mnau.xyz/hernik/canteenlib/issues/new?template=.github%2fISSUE_TEMPLATE%2fhl--en--kompatibility.md)
Pokud chcete přispět s testem, otestujte tuto knihovnu na instanci iCanteen, kde, nejlépe legálně, máte přístup, a nahlašte své poznatky [zde](https://github.com/hernikplays/canteenlib/issues/new?assignees=hernikplays&labels=kompatibilita&template=hl--en--kompatibility.md&title=Kompatibilita%3A+)

View file

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2022 Matyáš Caras
Copyright (c) 2022 Matyáš Caras and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View file

@ -1,6 +1,3 @@
## INFO
__Tato verze knihovny není dále vyvíjena. Vývoj teď probíhá na https://github.com/tpkowastaken/canteenlib__
## O knihovně
Experimentální **neoficiální** webscrape knihovna pro komunikaci se systémem [iCanteen](https://www.z-ware.cz/internetove-objednavky). **Knihovna je aktuálně nestabilní! Používejte na vlastní riziko!**
@ -15,34 +12,7 @@ Experimentální **neoficiální** webscrape knihovna pro komunikaci se systéme
## To do
- Kompatibilita se staršími verzemi iCanteen
Příklad používání [zde](https://git.mnau.xyz/hernik/canteenlib/src/branch/main/example/canteenlib_example.dart)
*\* Knihovna nemusí fungovat na všech instancích systému iCanteen, proto žádám každého, kdo může a je uživatelem iCanteen, aby otestoval funkčnost této knihovny a případné problémy [nahlásil](https://git.mnau.xyz/hernik/canteenlib/issues/new)*
*\* Knihovna nemusí fungovat na všech instancích systému iCanteen, proto žádám každého, kdo může a je uživatelem iCanteen, aby otestoval funkčnost této knihovny a případné problémy [nahlásil](https://github.com/hernikplays/canteenlib/issues)*
### Otestované instance iCanteen
[zde](https://git.mnau.xyz/hernik/canteenlib/src/branch/main/COMPATIBILITY.md)
## Licence
```
MIT License
Copyright (c) 2022 Matyáš Caras
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
[zde](https://github.com/hernikplays/canteenlib/blob/main/COMPATIBILITY.md)

View file

@ -1,15 +1,20 @@
import 'package:canteenlib/canteenlib.dart';
void main(List<String> args) async {
Canteen c = Canteen(
"https://kantyna.neco.cz"); // vytvořit instanci kantýny, všechna komunikace probíhá skrz ni
try {
await c.login("uzivatel", "heslo"); // přihlásit se
var jidelnicek = await c.jidelnicekDen(den: DateTime.parse("2022-04-04"));
print((await c.ziskejUzivatele()).kredit);
var objednano = await c.objednat(jidelnicek.jidla[0]);
print(objednano.objednano);
} catch (e) {
print("Při získávání informací nastala chyba: $e");
}
void main(List<String> args) {
Canteen c = Canteen("https://kantyna.neco.cz");
c.login("uzivatel", "heslo").then((value) {
c.jidelnicekDen(den: DateTime.parse("2022-04-04")).then((t) async {
print((await c.ziskejUzivatele()).kredit);
c.objednat(t.jidla[0]).then(
(value) {
t.jidla[0] = value; // divně udělané ale nic lepšího teď nevymyslím
print(t.jidla[0].objednano);
print(t.jidla[0].orderUrl);
},
);
});
}).catchError((o) {
print(o);
return null;
});
}

View file

@ -48,20 +48,17 @@ class Canteen {
prihlasen = false;
return Future.error("Uživatel není přihlášen");
}
var kreditMatch = double.tryParse(
RegExp(r' +<span id="Kredit" .+?>(.+?)(?=&)')
.firstMatch(r)!
.group(1)!
.replaceAll(",", ".")
.replaceAll(RegExp(r"[^\w.-]"), ""));
var m = double.tryParse(RegExp(r' +<span id="Kredit" .+?>(.+?)(?=&)')
.firstMatch(r)!
.group(1)!
.replaceAll(",", ".")
.replaceAll(RegExp(r"[^\w.]"), ""));
var jmenoMatch = RegExp(r'(?<=jméno: <b>).+?(?=<\/b)').firstMatch(r);
var prijmeniMatch = RegExp(r'(?<=příjmení: <b>).+?(?=<\/b)').firstMatch(r);
var kategorieMatch =
RegExp(r'(?<=kategorie: <b>).+?(?=<\/b)').firstMatch(r);
var ucetMatch = RegExp(r'účet pro platby do jídelny:\s*<b>(\d+/\d+)</b>')
.firstMatch(r)
?.group(1)
?.replaceAll(RegExp(r'<\/?b>'), ''); //odstranit html tag <b>
var ucetMatch = RegExp(r'(?<=účet pro platby do jídelny: <b>).+?(?=<\/b)')
.firstMatch(r);
var varMatch =
RegExp(r'(?<=variabilní symbol: <b>).+?(?=<\/b)').firstMatch(r);
var specMatch =
@ -70,10 +67,9 @@ class Canteen {
var jmeno = jmenoMatch?.group(0) ?? "";
var prijmeni = prijmeniMatch?.group(0) ?? "";
var kategorie = kategorieMatch?.group(0) ?? "";
var ucet = ucetMatch ?? "";
var ucet = ucetMatch?.group(0) ?? "";
var varSymbol = varMatch?.group(0) ?? "";
var specSymbol = specMatch?.group(0) ?? "";
var kredit = kreditMatch ?? 0.0;
return Uzivatel(
jmeno: jmeno,
@ -82,7 +78,7 @@ class Canteen {
ucetProPlatby: ucet,
varSymbol: varSymbol,
specSymbol: specSymbol,
kredit: kredit);
kredit: m ?? 0.0);
}
Future<void> _getFirstSession() async {
@ -118,11 +114,14 @@ class Canteen {
if (cookies["JSESSIONID"] == "" || cookies["XSRF-TOKEN"] == "") {
await _getFirstSession();
}
var res =
await http.post(Uri.parse("$url/j_spring_security_check"), headers: {
"Cookie":
"JSESSIONID=${cookies["JSESSIONID"]!}; XSRF-TOKEN=${cookies["XSRF-TOKEN"]!};",
await http.post(Uri.parse(url + "/j_spring_security_check"), headers: {
"Cookie": "JSESSIONID=" +
cookies["JSESSIONID"]! +
"; " +
"XSRF-TOKEN=" +
cookies["XSRF-TOKEN"]! +
";",
"Content-Type": "application/x-www-form-urlencoded",
}, body: {
"j_username": user,
@ -133,11 +132,9 @@ class Canteen {
"targetUrl":
"/faces/secured/main.jsp?terminal=false&status=true&printer=&keyboard="
});
if (res.headers['set-cookie']!.contains("remember-me=;")) {
return false; // špatné heslo
}
if (res.statusCode != 302) {
return Future.error("Chyba: ${res.body}");
}
@ -150,25 +147,27 @@ class Canteen {
/// Builder pro GET request
Future<String> _getRequest(String path) async {
var r = await http.get(Uri.parse(url + path), headers: {
"Cookie":
"JSESSIONID=${cookies["JSESSIONID"]!}; XSRF-TOKEN=${cookies["XSRF-TOKEN"]!}${cookies.containsKey("remember-me") ? "; ${cookies["remember-me"]!};" : ";"}",
"Cookie": "JSESSIONID=" +
cookies["JSESSIONID"]! +
"; " +
"XSRF-TOKEN=" +
cookies["XSRF-TOKEN"]! +
(cookies.containsKey("remember-me")
? "; " + cookies["remember-me"]! + ";"
: ";"),
});
if (r.statusCode != 200 ||
r.body.contains("fail") ||
r.body.contains("Chyba")) {
return Future.error("Chyba: ${r.body}");
}
if (r.body.contains("přihlášení uživatele")) {
prihlasen = false;
return Future.error("Uživatel není přihlášen");
}
if (r.headers.containsKey("set-cookie")) {
_parseCookies(r.headers["set-cookie"]!);
}
return r.body;
}
@ -185,12 +184,14 @@ class Canteen {
dotAll: true)
.allMatches(res)
.toList();
List<Jidelnicek> jidelnicek = [];
for (var t in reg) {
// projedeme každý den individuálně
var j = t.group(0).toString(); // převedeme text na něco přehlednějšího
var j = t
.group(0)
.toString() /*.replaceAll(RegExp(r'( )+|([^>a-z]\n)'),
'')*/
; // převedeme text na něco přehlednějšího
var den = DateTime.parse(RegExp(r'(?<=day-).+?(?=")', dotAll: true)
.firstMatch(j)!
.group(0)
@ -209,28 +210,24 @@ class Canteen {
}
List<Jidlo> jidla = [];
for (var jidloNaDen in jidlaDenne) {
// projedeme vsechna jidla
var s = jidloNaDen.group(0)!.replaceAll(
RegExp(
r'[a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:] [a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:]'),
''); // odstraní dvojté mezery mezi písmeny
var vydejna = RegExp(r'(?<=<span style="color: #1b75bb;">).+?(?=<)')
.firstMatch(s); // název výdejny / verze 2.18
vydejna ??= RegExp(
// TODO: Lepší systém pro podporu různých verzí iCanteen
r'(?<=<span class="smallBoldTitle" style="color: #1b75bb;">).+?(?=<)')
.firstMatch(s); // název výdejny / verze 2.10
var hlavni = RegExp(
r' {20}(([a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+ )+[a-zA-ZěščřžýáíéÉÍÁÝŽŘČŠĚŤŇťň.,:\/]+)',
dotAll: true)
.firstMatch(s)!
.group(1)
.toString(); // Jídlo
jidla.add(Jidlo(
nazev: hlavni,
objednano: false,
@ -257,27 +254,23 @@ class Canteen {
if (!prihlasen) {
return Future.error("Uživatel není přihlášen");
}
den ??= DateTime.now();
String res;
try {
res = await _getRequest(
"/faces/secured/main.jsp?day=${den.year}-${(den.month < 10) ? "0${den.month}" : den.month}-${(den.day < 10) ? "0${den.day}" : den.day}&terminal=false&printer=false&keyboard=false");
"/faces/secured/main.jsp?day=${den.year}-${(den.month < 10) ? "0" + den.month.toString() : den.month}-${(den.day < 10) ? "0" + den.day.toString() : den.day}&terminal=false&printer=false&keyboard=false");
} catch (e) {
return Future.error(e);
}
var obedDen = DateTime.parse(RegExp(r'(?<=day-).+?(?=")', dotAll: true)
.firstMatch(res)!
.group(0)
.toString());
var jidla = <Jidlo>[];
var jidelnicek = RegExp(
r'(?<=<div class="jidWrapLeft">).+?((fa-clock)|(fa-ban))',
dotAll: true)
.allMatches(res)
.toList();
var jidelnicek =
RegExp(r'(?<=<div class="jidWrapLeft">).+?((fa-clock))', dotAll: true)
.allMatches(res)
.toList();
for (var obed in jidelnicek) {
// formátování do třídy
var o = obed
@ -285,48 +278,28 @@ class Canteen {
.toString()
.replaceAll(RegExp(r'( )+|([^>a-z]\n)'), '');
var objednano = o.contains("Máte objednáno");
var lzeObjednat = !(o.contains("nelze zrušit") ||
o.contains("nelze objednat") ||
o.contains("nelze změnit"));
var lzeObjednat =
!(o.contains("nelze zrušit") || o.contains("nelze objednat"));
var cenaMatch =
RegExp(r'((?<=Cena objednaného jídla">).+?(?=&))').firstMatch(o);
RegExp(r'(?<=Cena objednaného jídla">).+?(?=&)').firstMatch(o);
cenaMatch ??=
RegExp(r'(?<=Cena při objednání jídla:&nbsp;).+?(?=&)').firstMatch(o);
cenaMatch ??=
RegExp(r'(?<=Cena při objednání jídla">).+?(?=&)').firstMatch(o);
var cena =
double.parse(cenaMatch!.group(0).toString().replaceAll(",", "."));
var jidlaProDen =
RegExp(r'<div class="jidWrapCenter.+?>(.+?)(?=<\/div>)', dotAll: true)
.firstMatch(o)!
.group(1)
.toString()
.replaceAll(' ,', ",")
.replaceAll(" <br>", "")
.replaceAll("\n", "");
var alergenyList =
RegExp(r"""<span(?: |\n).+?title="(.+?)".+?>(\d{1,2})""")
.allMatches(jidlaProDen)
.toList();
var alergeny = alergenyList.map<Alergen>((e) {
var jmeno = RegExp(r'<b>(.+?)<\/b>')
.firstMatch(e.group(1).toString())!
.group(1);
var popis =
RegExp(r'<\/b> - (.+)').firstMatch(e.group(1).toString())?.group(1);
var kod = int.parse(e.group(2).toString());
return Alergen(nazev: jmeno!, kod: kod, popis: popis);
}).toList();
var jidlaProDen = RegExp(r'(?<=Polévka: ).+')
.firstMatch(o)!
.group(0)
.toString()
.replaceAll(' ,', ",")
.replaceAll(" <br>", "")
.split(" / ");
var vydejna = RegExp(
r'(?<=<span class="smallBoldTitle button-link-align">).+?(?=<)')
.firstMatch(o)!
.group(0)
.toString();
String? orderUrl;
String? burzaUrl;
if (lzeObjednat) {
@ -338,31 +311,24 @@ class Canteen {
} else {
// jinak nastavíme URL pro burzu
var match = RegExp(
r"""db\/dbProcessOrder\.jsp.+?type=((plusburza)|(minusburza)|(multiburza)).+?(?=')""")
r"(?<=ajaxOrder\(this, ')(.+?)(?=').+?((do burzy)|(z burzy))")
.firstMatch(o);
if (match != null) {
burzaUrl = match.group(0)!.replaceAll("amp;", "");
burzaUrl = match.group(1)!.replaceAll("amp;", "");
}
}
var jidloJmeno = RegExp(r'(.+?)(?=<sub>)')
.firstMatch(jidlaProDen)!
.group(1)
.toString();
jidla.add(
Jidlo(
nazev: jidloJmeno.replaceAll(
r' (?=[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉŤŇťň])', ''),
objednano: objednano,
varianta: vydejna,
lzeObjednat: lzeObjednat,
cena: cena,
orderUrl: orderUrl,
den: obedDen,
burzaUrl: burzaUrl,
naBurze:
(burzaUrl == null) ? false : burzaUrl.contains("minusburza"),
alergeny: alergeny),
);
jidla.add(Jidlo(
nazev: jidlaProDen[1]
.replaceAll(r' (?=[^a-zA-ZěščřžýáíéĚŠČŘŽÝÁÍÉŤŇťň])', ''),
objednano: objednano,
varianta: vydejna,
lzeObjednat: lzeObjednat,
cena: cena,
orderUrl: orderUrl,
den: obedDen,
burzaUrl: burzaUrl,
naBurze:
(burzaUrl == null) ? false : !burzaUrl.contains("plusburza")));
// KONEC formátování do třídy
}
@ -380,14 +346,13 @@ class Canteen {
if (!prihlasen) {
return Future.error("Uživatel není přihlášen");
}
if (!j.lzeObjednat || j.orderUrl == null || j.orderUrl!.isEmpty) {
return Future.error(
"Jídlo nelze objednat nebo nemá adresu pro objednání");
}
try {
await _getRequest("/faces/secured/${j.orderUrl!}"); // provést operaci
await _getRequest("/faces/secured/" + j.orderUrl!); // provést operaci
} catch (e) {
return Future.error(e);
}
@ -409,23 +374,16 @@ class Canteen {
///
/// Výstup:
/// - Aktualizovaná instance [Jidlo] tohoto jídla NEBO [Future] jako chyba
Future<Jidlo> doBurzy(Jidlo j, {int amount = 1}) async {
Future<Jidlo> doBurzy(Jidlo j) async {
if (!prihlasen) {
return Future.error("Uživatel není přihlášen");
}
if (j.burzaUrl == null || j.burzaUrl!.isEmpty) {
return Future.error(
"Jídlo nelze uložit do burzy nebo nemá adresu pro uložení");
}
if (amount < 1 && j.burzaUrl!.endsWith("amount=")) {
return Future.error("Nemůžeš dát do burzy méně než jeden kus");
}
var finalUrl =
(j.burzaUrl!.endsWith("amount=")) ? "${j.burzaUrl}$amount" : j.burzaUrl;
try {
await _getRequest("/faces/secured/$finalUrl"); // provést operaci
await _getRequest("/faces/secured/" + j.burzaUrl!); // provést operaci
} catch (e) {
return Future.error(e);
}
@ -466,7 +424,6 @@ class Canteen {
dotAll: true)
.allMatches(bu)
.toList();
// Získat datum
var datumRaw = RegExp(r'\d\d\.\d\d\.\d{4}')
.firstMatch(data[1].group(0)!)!
@ -484,7 +441,6 @@ class Canteen {
.firstMatch(bu)!
.group(0)!
.replaceAll("&amp;", "&");
var jidlo = Burza(
den: datum,
varianta: varianta,
@ -503,13 +459,13 @@ class Canteen {
/// - `b` - Jídlo __z burzy__, které chceme objednat | [Burza]
///
/// Výstup:
/// - [bool], `true`, pokud bylo jídlo úspěšně objednáno z burzy, jinak `Exception`
/// - [bool], `true`, pokud bylo jídlo úspěšně objednáno z burzy, jinak `false`
Future<bool> objednatZBurzy(Burza b) async {
if (!prihlasen) return Future.error("Uživatel není přihlášen");
try {
await _getRequest("/faces/secured/${b.url!}");
await _getRequest("/faces/secured/" + b.url!); // TODO: SPRAVIT
} catch (e) {
return Future.error(e.toString());
return false;
}
return true;
}

View file

@ -21,11 +21,6 @@ class Jidlo {
/// Den, který je jídlo vydáváno
DateTime den;
/// Seznam alergenů
///
/// Pokud se žádný nepodařilo najít, vrací prázdný seznam
List<Alergen> alergeny;
/// URL pro požadavek na objednání jídla
final String? orderUrl;
@ -36,7 +31,6 @@ class Jidlo {
required this.objednano,
required this.varianta,
required this.den,
this.alergeny = const [],
this.cena,
required this.lzeObjednat,
this.orderUrl,
@ -44,15 +38,6 @@ class Jidlo {
required this.naBurze});
}
/// Popisuje alergen v jídelníčku
class Alergen {
final int kod;
final String nazev;
final String? popis;
const Alergen({required this.nazev, required this.kod, this.popis});
}
/// Reprezentuje cizí jídlo na burze
class Burza {
/// Den, který je jídlo vydáváno

View file

@ -1,15 +1,16 @@
name: canteenlib
description: Library for communication with the czech canteen food ordering system iCanteen
version: 2.0.0
repository: 'https://git.mnau.xyz/hernik/canteenlib'
issue_tracker: 'https://git.mnau.xyz/hernik/canteenlib/issues'
version: 0.1.0-alpha.15
repository: 'https://github.com/hernikplays/canteenlib'
issue_tracker: 'https://github.com/hernikplays/canteenlib/issues'
documentation: 'https://docs.hernikplays.cz'
environment:
sdk: '>=2.16.1 <4.0.0'
sdk: '>=2.16.1 <3.0.0'
dev_dependencies:
dotenv: ^4.0.1
lints: ^2.0.0
dotenv: ^3.0.0
lints: ^1.0.0
test: ^1.16.0
dependencies:
http: ^0.13.4

View file

@ -1,30 +1,19 @@
import 'package:canteenlib/canteenlib.dart';
import 'package:test/test.dart';
import 'package:dotenv/dotenv.dart';
import 'package:dotenv/dotenv.dart' show load, env;
void main() {
group('A group of tests', () {
var env = DotEnv(includePlatformEnvironment: true)..load();
load();
Canteen c = Canteen(env["ADDRESS"]!);
test('Log-in test', () {
c.login(env["USER"]!, env["PASS"]!).then((r) => expect(r, true));
setUp(() {
c.login(env["USER"]!, env["PASS"]!);
});
test('First Test', () {
c.login(env["USER"]!, env["PASS"]!).then((r) {
c.jidelnicekDen().then((t) {
expect(DateTime.now().day, t.den.day);
});
});
});
test('Neprázdný jídelníček', () {
c.login(env["USER"]!, env["PASS"]!).then((r) {
c.jidelnicekDen(den: DateTime.now().add(Duration(days: 5))).then((t) {
print(t.jidla[0].nazev);
expect(t.jidla[0].nazev.isNotEmpty, true);
});
c.jidelnicekDen().then((t) {
expect(DateTime.now().day, t.den.day);
});
});
});