Testplan AMOGUS
Test types
-
Unit tests
-
Beta tests
Target test coverage
The target test coverage is 60% in terms of unit testing line and branch coverage. Goal is to test the services functionalities.
Testing tools
Unit testing
Beta tests
-
Humans: Some random dudes who will test the application e. g. Luca Hackl
-
Test server
Test case management
Github Actions will show the amount of tests passed and failed per pull request.
Test cases
Unit test cases
Auth Service
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 1 | CreateRolesAsync | CreateRolesAsync_WhenGivenRoles_CreatesThem | UserRoles class | All Roles correctly created in the RoleManager |
| 2 | CreateRolesAsync | CreateRolesAsync_WhenGivenRoles_AndRoleAlreadyExists_DoesNotCreateIt | UserRoles class | No roles created in the RoleManager |
| 3 | LoginUserAsync | LoginUserAsync_WhenGivenUserData_AndEmailWrong_Exception | Wrong email | Faulted result |
| 4 | LoginUserAsync | LoginUserAsync_WhenGivenUserData_AndPasswordWrong_Exception | Wrong password | Faulted result |
| 5 | LoginUserAsync | LoginUserAsync_WhenGivenUserData_AndAllCorrect_LoginUser | Correct user data | Successful result and Auth Token |
| 6 | RegisterUserAsync | RegisterUserAsync_WhenValidationFails_Exception | user data with failed validation | Faulted result |
| 7 | RegisterUserAsync | RegisterUserAsync_WhenGivenRegisterModel_AndUserAlreadyExists_Exception | user data that already exists | Faulted result |
| 8 | RegisterUserAsync | RegisterUserAsync_WhenGivenRegisterModel_AndFailedToCreate_Exception | valid data but cant create user | Faulted result |
| 9 | RegisterUserAsync | RegisterUserAsync_WhenGivenRegisterModel_AndRoleDoesNotExist_Exception | valid user data but non existent role | Faulted result |
| 10 | RegisterUserAsync | RegisterUserAsync_WhenGivenRegisterModel_AndEverythingIsFine_LoginUser | valid user data and valid role | Successful result and Auth Token |
ExerciseService
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 11 | CheckAnswer | CheckAnswer_WhenGivenAnswer_AndQuestionIsNotRandomMental_ AndOrigQuestionNotFound_ReturnsFalse |
Non random question, that does not exist | false |
| 12 | CheckAnswer | CheckAnswer_WhenGivenAnswer_AndQuestionIsRandomMental_ AndAnswerIsNotCalculable_ReturnsFalse |
random question that cannot be calculated | false |
| 13 | CheckAnswer | CheckAnswer_WhenGivenAnswer_AndQuestionIsNotRandomMental_ AndQuestionExists_ReturnAnswerIsCorrect |
non random question with correct answer | true |
| 14 | CheckAnswer | CheckAnswer_WhenGivenAnswer_AndQuestionIsNotRandomMental_ AndQuestionExists_ReturnAnswerIsNotCorrect |
non random question with incorrect answer | false |
| 15 | CheckAnswer | CheckAnswer_WhenGivenAnswer_AndQuestionIsRandomMental_ ReturnAnswerIsCorrect |
random question with correct answer | true |
| 16 | CheckAnswer | CheckAnswer_WhenGivenAnswer_AndQuestionIsRandomMental_ ReturnAnswerIsNotCorrect |
random question with incorrect answer | false |
GameService
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 17 | NewSession | NewSession_WithoutQuestionAmount_ReturnsSessionWith10Questions | no amount specified | Session with 10 questions |
| 18 | NewSession | NewSession_WithQuestionAmount1_ReturnsSessionWith1Question | amount should be 10 | Session with 10 questions |
| 19 | EndSessionAsync | EndSessionAsync_AndUserNotFound_ReturnsException | Wrong userId | Faulted result |
| 20 | EndSessionAsync | EndSessionAsync_AndUserFound_AndValidationFails_ReturnsException | non valid session model | Faulted result |
| 21 | EndSessionAsync | EndSessionAsync_AndUserFound_AndSessionValid_ButDbNotAffected_ReturnsFaulted | Session cannot be saved | Faulted result |
| 22 | EndSessionAsync | EndSessionAsync_AndUserFound_AndSessionValid_AndDbAffected_ReturnsSuccess | session can be saves | Successful result |
UserService
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 23 | GetUserAsync | GetUserAsync_WhenGivenAUserId_AndNoUserWithThatIdExists_Exception | wrong userId | Faulted result |
| 24 | GetUserAsync | GetUserAsync_WhenGivenAUserId_AndUserWithThatIdExists_ReturnsUser | valid userid | Successful result and user |
| 25 | IsInRoleAsync | IsInRoleAsync_WhenGivenAUserId_AndRole_AndUserNotInRole_ReturnsFalse | userId not in role | false |
| 26 | IsInRoleAsync | IsInRoleAsync_WhenGivenAUserId_AndRole_AndUserInRole_ReturnsTrue | userId in role | true |
| 27 | DeleteUserAsync | DeleteUserAsync_WhenGivenAUserId_AndUserNotFound_ReturnsFaulted | wrong userId | Faulted result |
| 28 | DeleteUserAsync | DeleteUserAsync_WhenGivenAUserId_AndUserManagerCantDelete_Exception | valid userId but userManager cannot delete | Faulted result |
| 29 | DeleteUserAsync | DeleteUserAsync_WhenGivenAUserId_AndEverythingIsFine_ReturnTrue | valid userId | Successful result and user is deleted |
TeacherService
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 30 | AddQuestionAsync | AddQuestionAsync_WhenGivenQuestion_AndEverythingIsFine_AddsQuestionAndReturnsQuestion | valid Question | Successful result and Question |
| 31 | AddQuestionAsync | AddQuestionAsync_WhenGivenQuestion_AndIOException_ReturnsException | empty Question | faulted result |
| 32 | DeleteQuestionByIdAsync | DeleteQuestionByIdAsync_WhenGivenQuestionId_AndQuestionDoesNotExist_ReturnsException | invalid QuestionID | faulted result |
| 33 | DeleteQuestionByIdAsync | DeleteQuestionByIdAsync_WhenGivenQuestionId_AndQuestionFileNotAccessible_ReturnsException | valid QuestionID but not accessible | faulted result |
| 34 | DeleteQuestionByIdAsync | DeleteQuestionByIdAsync_WhenGivenQuestionId_AndEverythingIsFine_ReturnsTrue_AndQuestionDeleted | valid QuestionID | Successful result and question deleted |
| 35 | GetQuestionById | GetQuestionById_WhenGivenQuestionId_AndQuestionDoesNotExist_ReturnsException | invalid QuestionID | Faulted result |
| 36 | GetQuestionById | GetQuestionById_WhenGivenQuestionId_AndQuestionDoesExist_ReturnsQuestion | valid QuestionID | Successful result and question |
StreaksService
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 37 | ReadStreakAsync | ReadStreakAsync_WhenGivenAUserId_AndUserHasNoStats_Exception | UserID with no stats | Faulted result |
| 38 | ReadStreakAsync | ReadStreakAsync_WhenGivenAUserId_AndUserHasStats_ReturnsCurrentStreak | valid userid with stats | Successful result and current streak |
| 39 | UpdateAllStreaksAsync | UpdateAllStreaksAsync_WhenPlayerHasNotPlayedToday_AndNotLongestStreak_StreakIsSetTo0 | player that hasn't played today | streak set to 0 |
| 40 | UpdateAllStreaksAsync | UpdateAllStreaksAsync_WhenPlayerHasNotPlayedToday_AndLongestStreak_StreakIsSetTo0_ButKeepLongest | player that hasn't played today | streak set to 0 and longest streak kept |
| 41 | UpdateAllStreaksAsync | UpdateAllStreaksAsync_WhenPlayerHasPlayedToday_ButNotLongestStreak_StreakIsNotLost | player that has played today | streak is kept |
| 42 | UpdateAllStreaksAsync | UpdateAllStreaksAsync_StreaksOfAllPlayersAreUpdated | multiple players that have not played today | all streaks set to 0 |
StatsService
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 43 | GetUserStatsAsync | GetUserStatsAsync_WhenGivenAUserId_AndUserHasNoStats_Exception | userid that has no stats | Faulted result |
| 44 | GetUserStatsAsync | GetUserStatsAsync_WhenGivenAUserId_AndUserHasStats_ReturnsStats | userId that has stats | Successful result and stats |
| 45 | GetDetailedUserStatsModelAsync | GetDetailedUserStatsModelAsync_WhenGivenAUserId_AndUserHasNoStats_Exception | userid that has no stats | Faulted result |
| 46 | GetDetailedUserStatsModelAsync | GetDetailedUserStatsModelAsync_WhenGivenAUserId_EverythingAlright_ReturnsDetailedUserstats | userId that has stats | Successful result and detailed UserStatsApiModel |
| 47 | UpdateUserStatsAsync(UserStats userStats) | UpdateUserStatsAsync_WhenGivenUserStats_AndValidationFails_ReturnsFalse | invalid UserStats | false |
| 48 | UpdateUserStatsAsync(UserStats userStats) | UpdateUserStatsAsync_WhenGivenUserStats_UpdateInDbFails_ReturnsFalse | valid UserStats but repository failed updating | false |
| 49 | UpdateUserStatsAsync(UserStats userStats) | UpdateUserStatsAsync_WhenGivenUserStats_AndEverythingIsFine_ReturnsTrue | valid UserStats | true |
| 50 | UpdateUserStatsAsync(GameSession session, bool[] answers, ApplicationUser user) | UpdateUserStatsAsync_WhenGivenGameSessionAnswersAndUser_AndValidationFails_ReturnsFalse | invalid GameSession, Answers and user | false |
| 51 | UpdateUserStatsAsync(GameSession session, bool[] answers, ApplicationUser user) | UpdateUserStatsAsync_WhenGivenGameSessionAnswersAndUser_UpdateInDbFails_ReturnsFalse | valid GameSession, Answers and user but update in db fails | false |
| 52 | UpdateUserStatsAsync(GameSession session, bool[] answers, ApplicationUser user) | UpdateUserStatsAsync_WhenGivenGameSessionAnswersAndUser_AndEverythingIsFine_ReturnsTrue | valid GameSession, Answers and user | true |
| 53 | UpdateUserStatsAsync(GameSession session, bool[] answers, ApplicationUser user) | UpdateUserStatsAsync_WhenGivenGameSessionAnswersAndUser_AndEverythingIsFine_StatsAreUpdatedCorrectly | valid GameSession, Answers and user | true and stats updated correctly |
| 54 | UpdateUserStatsAsync(GameSession session, bool[] answers, ApplicationUser user) | UpdateUserStatsAsync_WhenGivenGameSessionAnswersAndUser_AndEverythingIsFine_StatsAreUpdatedCorrectly2 | valid GameSession, Answers and user (other values than above so other changes happen) | true and stats updated correctly |
| 55 | UpdateUserStatsAsync(GameSession session, bool[] answers, ApplicationUser user) | UpdateUserStatsAsync_WhenGivenGameSessionAnswersAndUser_AndUserHasNotPlayedYet_StreakIsUpdated | like the above but playedtoday is false | played today is now true and streak is updated |
| 56 | UpdateUserStatsAsync(GameSession session, bool[] answers, ApplicationUser user) | UpdateUserStatsAsync_WhenGivenGameSessionAnswersAndUser_AndUserHasPlayedAlready_StreakIsNotIncreased | like the above but playedtoday is true | streak is not increased |
LeaderboardService
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 57 | GetLeaderboardAsync | GetLeaderboardAsync_ReturnsCorrectObject | UserStats mock | Correct Object hirachy |
MentalExerciseFactory
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 58 | Median | Median_Returns0_ForEmptyArray | Empty Array | 0 |
| 59 | Median | Median_ReturnsFirstElement_ForArrayWithSize1 | Array with 1 Element | The first element |
| 60 | Median | Median_ReturnsAverage_ForArrayWithSize2 | Array with 2 Elements | Average |
| 61 | Median | Median_ReturnsMedian_ForSortedArrayWithEvenCount | Sorted Array with even Elements | Correct median |
| 62 | Median | Median_ReturnsMedian_ForSortedArrayWithOddCount | Sorted Array with Odd Elements | Correct median |
| 63 | Median | Median_ReturnsMedian_ForRandomArrayWithEvenCount | Shuffled Array with even Elements | Correct median |
| 64 | Median | Median_ReturnsMedian_ForRandomArrayWithOddCount | Shuffled Array with Odd Elements | Correct median |
| 65 | CalcAnswer | CalcAnswer_ReturnsEmpty_WithEmptyQuestion | Empty Question | Empty String |
| 66 | CalcAnswer | CalcAnswer_SolvesEquation_WithXInQuestion | Equation with x | set of solutions |
| 67 | CalcAnswer | CalcAnswer_SolvesExpression_WithQuestion | Expressions without x | Correct answer for the expressions |
| 68 | CalcAnswer | CalcAnswer_ReturnsEmpty_ForXInStatement | Expressions with x | empty string |
Game Session Validator
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 69 | Rules | SessionId_CannotBeEmpty | Empty sessionid | false |
| 70 | Rules | SessionId_ShouldBeValidGuid | invalid guid | false |
| 71 | Rules | SessionId_ShouldBeValid | valid guid | true |
| 72 | Rules | Playtime_ShouldNotBeSmallerThanZero | -1 | false |
| 73 | Rules | Playtime_CanBeZeroOrBigger | 0, 0.1, 1 | true |
| 74 | Rules | CorrectAnswersCount_ShouldNotBeSmallerThanZero | -1 | false |
| 75 | Rules | CorrectAnswersCount_CanBeZeroOrBigger | 0, 1 | true |
| 76 | Rules | GivenAnswersCount_ShouldNotBeSmallerThanZero | -1 | false |
| 77 | Rules | GivenAnswersCount_CanBeZeroOrBigger | 0, 1 | true |
| 78 | Rules | AverageTimePerQuestion_ShouldNotBeSmallerThanZero | -1 | false |
| 79 | Rules | AverageTimePerQuestion_CanBeZeroOrBigger | 0, 0.1, 1 | true |
| 80 | Rules | QuickestAnswer_ShouldNotBeSmallerThanZero | -1 | false |
| 81 | Rules | QuickestAnswer_CanBeZeroOrBigger | 0, 0.1, 1 | true |
| 82 | Rules | SlowestAnswer_ShouldNotBeSmallerThanZero | -1 | false |
| 83 | Rules | SlowestAnswer_CanBeZeroOrBigger | 0, 0.1, 1 | true |
Registermodel Validator
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 84 | Rules | Email_CannotBeEmpty | Empty email | false |
| 85 | Rules | Email_CannotBeInvalid | invalid emails | false |
| 86 | Rules | Email_IsValid | valid email | true |
| 87 | Rules | Username_CannotBeEmpty | empty username | false |
| 88 | Rules | Username_IsValid | non-empty username | true |
| 89 | Rules | Password_CannotBeEmpty | empty password | false |
| 90 | Rules | Password_MustHaveOneLowercase | password without lowercase | false |
| 91 | Rules | Password_MustHaveOneUppercase | password without uppercase | false |
| 92 | Rules | Password_MustHaveOneDigit | password without digit | false |
| 93 | Rules | Password_MustHaveOneSpecialChar | password without special char | false |
| 94 | Rules | Password_MustBeAtLeastSixCharsLong | password shorter than 6 chars | false |
| 95 | Rules | Password_ShouldBeValid | valid passwords | true |
Game Session Validator
| # | Tested method | Objective | Input | Expected Result |
|---|---|---|---|---|
| 96 | Rules | Level_ShouldNotBeSmallerThanZero | -1 | false |
| 97 | Rules | Level_CanBeZeroOrBigger | 0, 1 | true |
| 98 | Rules | CurrentStreak_ShouldNotBeSmallerThanZero | -1 | false |
| 99 | Rules | CurrentStreak_CanBeZeroOrBigger | 0, 1 | true |
| 100 | Rules | OverallAnswered_ShouldNotBeSmallerThanZero | -1 | false |
| 101 | Rules | OverallAnswered_CanBeZeroOrBigger | 0, 1 | true |
| 102 | Rules | CorrectAnswers_ShouldNotBeSmallerThanZero | -1 | false |
| 103 | Rules | CorrectAnswers_CanBeZeroOrBigger | 0, 1 | true |
| 104 | Rules | TotalTimePlayed_ShouldNotBeSmallerThanZero | -1 | false |
| 105 | Rules | TotalTimePlayed_CanBeZeroOrBigger | 0, 0.1, 1 | true |
| 106 | Rules | QuickestAnswer_ShouldNotBeSmallerThanZero | -1 | false |
| 107 | Rules | QuickestAnswer_CanBeZeroOrBigger | 0, 0.1, 1 | true |
| 108 | Rules | SlowestAnswer_ShouldNotBeSmallerThanZero | -1 | false |
| 109 | Rules | SlowestAnswer_CanBeZeroOrBigger | 0, 0.1, 1 | true |
| 110 | Rules | LongestStreak_ShouldNotBeSmallerThanZero | -1 | false |
| 111 | Rules | LongestStreak_CanBeZeroOrBigger | 0, 1 | true |
| 112 | Rules | LongestStreak_CannotBeSmallerThanCurrentStreak | currentstreak=1, longeststreak=0 | false |
Last update:
2023-06-09