5.5 KiB
Testy: Jde pridat knihu Jde pridat autora Jde pridat publishera Jde zmenit pocet vytisku vlastnenych knihovnou Jde Vypsat vsechny knihy Jde provezt vypujcku Jde pridat ctenare Jde vratit vypujcku knihy Jde vyhledat knihu dle autora, jmena, nevypujcenych knih, a ztracenych knih Odstranit knhu Upravit autora
Co maji handlovat: Prazdne inputy od uzivatele Consecutive r/w Type checking Fuzzing inputu
Scénáře (přidání knihy) + očekávané výstupy
-
Předpoklady testů:
- Existuje
AuthorIDaPublisherIDv DB (jinak přidání knihy selže a funkce vrátí null). - Implementace
Team2.AddBookvkládá přesINSERT OR IGNOREa následně děláSELECT ... LIMIT 1podle kombinace(Name, AuthorID, PublisherID, YearOfRelease). - Poznámka ke schématu: pokud tabulka
BooksNEOBSAHUJE sloupecAvailable, vkládání selže SQL chybou a funkce vrátí null. PokudAvailableexistuje (v předem připravené DB), testy sAvailabledávají smysl.
- Existuje
-
Základní flow – úspěch:
- Vstup: validní
name, existujícíauthorId, existujícípublisherId, rozumnýyear,total >= 0,available >= 0. - Očekávaný výstup:
BookDtos nenulovýmId, hodnotami dle vstupu; návrat nenull.
- Vstup: validní
-
Neexistující autor:
- Vstup:
authorIdneexistuje vAuthors. - Očekávaný výstup: nenastane insert, funkce vrátí
null.
- Vstup:
-
Neexistující publisher:
- Vstup:
publisherIdneexistuje vPublisher. - Očekávaný výstup: nenastane insert, funkce vrátí
null.
- Vstup:
-
Duplicita knihy (stejný
name+authorId+publisherId+year):- Pokud v DB existuje unikátní omezení na tuto kombinaci:
INSERT OR IGNOREneprovede insert aSELECT ... LIMIT 1vrátí existující řádek ⇒BookDto(nenull), nezdvojené data. - Pokud v DB NEexistuje žádné unikátní omezení (výchozí schema v
Database.csho nemá): dojde ke vložení DUPLIKÁTNÍHO řádku,SELECT ... LIMIT 1vrátí libovolný první shodný záznam ⇒BookDto(nenull), ale data jsou duplicitní v tabulce.
- Pokud v DB existuje unikátní omezení na tuto kombinaci:
-
nameprázdný řetězec:Books.NamejeNOT NULL, ale prázdný řetězec NENÍNULL⇒ vložení projde.- Očekávaný výstup:
BookDto(nenull).
-
name= null:- Při předání
nulljako parametru může dojít k chybě binderu parametrů nebo k pokusu vložitNULLdoNOT NULLsloupce. - Očekávaný výstup: SQL nebo parametrická výjimka uvnitř metody ⇒ metoda chytá výjimku a vrátí
null.
- Při předání
-
yearzáporný nebo 0:- Není validováno na aplikační úrovni ani ve schématu.
- Očekávaný výstup: vložení projde ⇒
BookDto(nenull).
-
totalzáporné číslo:- Není validováno; ve schématu žádné omezení.
- Očekávaný výstup: vložení projde ⇒
BookDto(nenull). Pozn.: následné reporty mohou dávat nelogické výsledky.
-
available>total:- Není validováno; pokud sloupec
Availablev DB existuje, vloží se bez kontroly. - Očekávaný výstup:
BookDto(nenull).
- Není validováno; pokud sloupec
-
availablezáporné:- Není validováno; pokud sloupec existuje, vloží se.
- Očekávaný výstup:
BookDto(nenull).
-
Extrémně dlouhé
name:- Bez omezení délky; SQLite uloží. Může mít dopad na výkon a čitelnost.
- Očekávaný výstup:
BookDto(nenull).
-
Speciální znaky / SQL injection v
name:- Parametrizované dotazy ⇒ bezpečné vůči SQLi.
- Očekávaný výstup:
BookDto(nenull).
-
Současné (konkurenční) vkládání stejné knihy:
- Bez unikátního indexu hrozí race condition ⇒ vícenásobné duplicity.
- Očekávaný výstup: více identických řádků v
Books.
-
Nesoulad schématu: chybějící
AvailableveBooks:INSERTobsahujeAvailablesloupec; pokud DB nemáAvailable, dojde k SQL chybě.- Očekávaný výstup: metoda vrátí
null.
Scénáře (autor) – “stejný autor včetně DOB”
-
Vytvoření autora se stejným
Name+Surname+DateOfBirthopakovaně:- Pokud existuje unikátní omezení nad (Name, Surname, DateOfBirth):
INSERT OR IGNOREneprovede insert ⇒ vrácen bude existující autor (nenull). - Pokud unikát neexistuje (výchozí schema v
Database.csjej nemá): vloží se DUPLIKÁT; následnýSELECT ... LIMIT 1vrátí některého z nich ⇒AuthorDto(nenull), ale v DB jsou duplicity.
- Pokud existuje unikátní omezení nad (Name, Surname, DateOfBirth):
-
Přidání knihy k “stejnému autorovi”:
- Logika knihy pracuje výhradně s
authorId. Pokud existují 2 různé řádky autora se stejnými údaji (Name/Surname/DOB), ale rozdílnýmID, přidání knihy proběhne ke kterékoliv instanci podle zvolenéhoauthorId. - Očekávaný výstup:
BookDto(nenull), navázáno na konkrétníAuthorID, nikoli na shodu jména/DOB.
- Logika knihy pracuje výhradně s
Edge cases (souhrn)
- Chybějící cizí klíče (
AuthorID,PublisherID) ⇒ návratnull. - Duplicity bez unikátních indexů ⇒ v DB vznikají vícenásobné identické záznamy.
- Schéma vs. kód:
AvailableveBooks– pokud chybí, přidání knihy vždy selže ⇒null. Nameprázdný vsNULL: prázdný projde,NULLvyvolá chybu kvůliNOT NULL.- Hodnoty mimo rozsah (záporné
year/total/available) nejsou validovány. - Neprobíhá automatické snižování zásob po výpůjčce (
BorrowsneupravujíBooks.Total/Available). - Potenciálně nekonzistentní pluralita tabulek v jiných částech (např.
PublishersvsPublisher) – neovlivňujeTeam2.AddBook, ale je rizikem v integračních testech.