Skip to content

Commit

Permalink
Fixed Delete Team Endpoint Tests (#40)
Browse files Browse the repository at this point in the history
* fixed to correctly create data and test existence of data after removing team from database
* fixed correct creating of owner in WithRandomMembers method for testing data
* fixed default behavior of MultipleCollectionIncludeWarning for endpoint tests
  • Loading branch information
skrasekmichael authored Mar 13, 2024
1 parent a59ced2 commit 348b99b
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ public static TeamGenerator WithRandomMembers(this TeamGenerator teamGenerator,

return teamGenerator
.RuleFor(TeamGenerators.TEAM_MEMBERS_FIELD, (f, t) => f
.Make(count, index => f.PickRandom(pot)
.Make(count, index => f.PopRandom(new List<User>(pot))
.Map(user => TeamGenerators.TeamMember
.RuleForBackingField(tm => tm.TeamId, t.Id)
.RuleForBackingField(tm => tm.UserId, user.Id)
.RuleFor(tm => tm.Nickname, user.Name)
.RuleFor(tm => tm.Role, index == 0 ? TeamRole.Owner : TeamRole.Member)
.RuleFor(tm => tm.Role, index == 1 ? TeamRole.Owner : TeamRole.Member)
.Generate()))
.ToHashSet()
.ToList());
Expand Down
7 changes: 7 additions & 0 deletions tests/TeamUp.Tests.Common/Extensions/FakerExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ public static T PickRandomFromReadOnlyList<T>(this Faker faker, IReadOnlyList<T>
return list[index];
}

public static T PopRandom<T>(this Faker faker, List<T> list) where T : class
{
var elem = faker.PickRandom(list);
list.Remove(elem);
return elem;
}

public static Faker<T> UsePrivateConstructor<T>(this Faker<T> faker) where T : class
=> faker.CustomInstantiator(f => (Activator.CreateInstance(typeof(T), nonPublic: true) as T)!);

Expand Down
2 changes: 1 addition & 1 deletion tests/TeamUp.Tests.EndToEnd/AppFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ protected override void ConfigureWebHost(IWebHostBuilder builder)
options.UseNpgsql(connectionString);
options.ConfigureWarnings(warning =>
{
warning.Throw(RelationalEventId.MultipleCollectionIncludeWarning);
warning.Log(RelationalEventId.MultipleCollectionIncludeWarning);
});
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
using Microsoft.EntityFrameworkCore;

using EventResponse = TeamUp.Domain.Aggregates.Events.EventResponse;

namespace TeamUp.Tests.EndToEnd.EndpointTests.Teams;

public sealed class DeleteTeamTests(AppFixture app) : TeamTests(app)
Expand All @@ -13,42 +11,61 @@ public sealed class DeleteTeamTests(AppFixture app) : TeamTests(app)
public async Task DeleteTeam_AsOwner_Should_DeleteTeamInDatabase()
{
//arrange
var owner = UserGenerators.ActivatedUser.Generate();
var members = UserGenerators.ActivatedUser.Generate(19);
var team = TeamGenerators.Team.WithMembers(owner, members).Generate();
var users = UserGenerators.ActivatedUser.Generate(80);
var teams = TeamGenerators.Team
.WithRandomMembers(25, users)
.WithEventTypes(5)
.Generate(4);

var teamEvents = teams.Select(team =>
{
return EventGenerators.Event
.ForTeam(team.Id)
.WithEventType(team.EventTypes[0].Id)
.WithRandomEventResponses(team.Members)
.Generate(15);
}).ToList();
var events = teamEvents.SelectMany(events => events);

var targetTeamIndex = F.Random.Int(0, teams.Count - 1);
var targetTeam = teams[targetTeamIndex];
var teamOwner = targetTeam.Members.Single(member => member.Role.IsOwner());
var initiatorUser = users.Single(user => user.Id == teamOwner.UserId);

await UseDbContextAsync(dbContext =>
{
dbContext.Users.Add(owner);
dbContext.Users.AddRange(members);
dbContext.Teams.Add(team);
dbContext.Users.AddRange(users);
dbContext.Teams.AddRange(teams);
dbContext.Events.AddRange(events);
return dbContext.SaveChangesAsync();
});

Authenticate(owner);
Authenticate(initiatorUser);

//act
var response = await Client.DeleteAsync(GetUrl(team.Id));
var response = await Client.DeleteAsync(GetUrl(targetTeam.Id));

//assert
response.Should().Be200Ok();

await UseDbContextAsync(async dbContext =>
{
var deletedTeam = await dbContext.Teams.FindAsync(team.Id);
deletedTeam.Should().BeNull();
var members = await dbContext.Set<TeamMember>().ToListAsync();
members.Should().BeEmpty();
var eventTypes = await dbContext.Set<EventType>().ToListAsync();
eventTypes.Should().BeEmpty();
var events = await dbContext.Events.ToListAsync();
events.Should().BeEmpty();
var eventResponses = await dbContext.Set<EventResponse>().ToListAsync();
eventResponses.Should().BeEmpty();
//no users deleted
var notDeletedUsers = await dbContext.Users.ToListAsync();
notDeletedUsers.Should().BeEquivalentTo(users);
//only team, team members and event types from target team were deleted
var notDeletedTeams = await dbContext.Teams
.Include(team => team.Members)
.Include(team => team.EventTypes)
.ToListAsync();
notDeletedTeams.Should().BeEquivalentTo(teams.Except([targetTeam]));
//only events and event responses from target team were deleted
var notDeletedEvents = await dbContext.Events
.Include(e => e.EventResponses)
.ToListAsync();
notDeletedEvents.Should().BeEquivalentTo(events.Except(teamEvents[targetTeamIndex]));
});
}

Expand Down

0 comments on commit 348b99b

Please sign in to comment.