Skip to content

Commit 8ac10b4

Browse files
committed
test(custom): add test for authorization implementation
1 parent c669d6e commit 8ac10b4

File tree

4 files changed

+162
-0
lines changed

4 files changed

+162
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System.Net;
2+
using System.Net.Http;
3+
using System.Threading.Tasks;
4+
using DotNetCoreDocs;
5+
using DotNetCoreDocs.Writers;
6+
using JsonApiDotNetCoreExample;
7+
using Microsoft.AspNetCore.Hosting;
8+
using Microsoft.AspNetCore.TestHost;
9+
using Newtonsoft.Json;
10+
using Xunit;
11+
using JsonApiDotNetCore.Models;
12+
using JsonApiDotNetCoreExample.Data;
13+
using JsonApiDotNetCoreExampleTests.Startups;
14+
using JsonApiDotNetCoreExample.Models;
15+
using JsonApiDotNetCoreExampleTests.Services;
16+
using JsonApiDotNetCore.Serialization;
17+
using JsonApiDotNetCore.Services;
18+
19+
namespace JsonApiDotNetCoreExampleTests.Acceptance.Spec.DocumentTests
20+
{
21+
[Collection("WebHostCollection")]
22+
public class RepositoryOverrideTests
23+
{
24+
public RepositoryOverrideTests()
25+
{ }
26+
27+
[Fact]
28+
public async Task Total_Record_Count_Included()
29+
{
30+
// arrange
31+
var builder = new WebHostBuilder()
32+
.UseStartup<AuthorizedStartup>();
33+
var server = new TestServer(builder);
34+
var client = server.CreateClient();
35+
var context = (AppDbContext)server.Host.Services.GetService(typeof(AppDbContext));
36+
var jsonApiContext = (IJsonApiContext)server.Host.Services.GetService(typeof(IJsonApiContext));
37+
38+
var person = new Person();
39+
context.People.Add(person);
40+
var ownedTodoItem = new TodoItem();
41+
var unOwnedTodoItem = new TodoItem();
42+
ownedTodoItem.Owner = person;
43+
context.TodoItems.Add(ownedTodoItem);
44+
context.TodoItems.Add(unOwnedTodoItem);
45+
context.SaveChanges();
46+
47+
var authService = (IAuthorizationService)server.Host.Services.GetService(typeof(IAuthorizationService));
48+
authService.CurrentUserId = person.Id;
49+
50+
var httpMethod = new HttpMethod("GET");
51+
var route = $"/api/v1/todo-items?include=owner";
52+
53+
var request = new HttpRequestMessage(httpMethod, route);
54+
55+
// act
56+
var response = await client.SendAsync(request);
57+
var responseBody = await response.Content.ReadAsStringAsync();
58+
var deserializedBody = JsonApiDeSerializer.DeserializeList<TodoItem>(responseBody, jsonApiContext);
59+
60+
// assert
61+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
62+
foreach(var item in deserializedBody)
63+
Assert.Equal(person.Id, item.OwnerId);
64+
}
65+
}
66+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System.Linq;
2+
using JsonApiDotNetCore.Data;
3+
using JsonApiDotNetCore.Services;
4+
using JsonApiDotNetCoreExample.Data;
5+
using JsonApiDotNetCoreExample.Models;
6+
using JsonApiDotNetCoreExampleTests.Services;
7+
using Microsoft.Extensions.Logging;
8+
9+
namespace JsonApiDotNetCoreExampleTests.Repositories
10+
{
11+
public class AuthorizedTodoItemsRepository : DefaultEntityRepository<TodoItem>
12+
{
13+
private readonly ILogger _logger;
14+
private readonly AppDbContext _context;
15+
private readonly IAuthorizationService _authService;
16+
17+
public AuthorizedTodoItemsRepository(AppDbContext context,
18+
ILoggerFactory loggerFactory,
19+
IJsonApiContext jsonApiContext,
20+
IAuthorizationService authService)
21+
: base(context, loggerFactory, jsonApiContext)
22+
{
23+
_context = context;
24+
_logger = loggerFactory.CreateLogger<AuthorizedTodoItemsRepository>();
25+
_authService = authService;
26+
}
27+
28+
public override IQueryable<TodoItem> Get()
29+
{
30+
return base.Get().Where(todoItem => todoItem.OwnerId == _authService.CurrentUserId);
31+
}
32+
}
33+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace JsonApiDotNetCoreExampleTests.Services
2+
{
3+
public interface IAuthorizationService
4+
{
5+
int CurrentUserId { get; set; }
6+
}
7+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using Microsoft.AspNetCore.Hosting;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.Extensions.Logging;
4+
using JsonApiDotNetCoreExample.Data;
5+
using Microsoft.EntityFrameworkCore;
6+
using JsonApiDotNetCore.Extensions;
7+
using DotNetCoreDocs.Configuration;
8+
using System;
9+
using JsonApiDotNetCoreExample;
10+
using Moq;
11+
using JsonApiDotNetCoreExampleTests.Services;
12+
using JsonApiDotNetCore.Data;
13+
using JsonApiDotNetCoreExample.Models;
14+
using JsonApiDotNetCoreExampleTests.Repositories;
15+
16+
namespace JsonApiDotNetCoreExampleTests.Startups
17+
{
18+
public class AuthorizedStartup : Startup
19+
{
20+
public AuthorizedStartup(IHostingEnvironment env)
21+
: base (env)
22+
{ }
23+
24+
public override IServiceProvider ConfigureServices(IServiceCollection services)
25+
{
26+
var loggerFactory = new LoggerFactory();
27+
28+
loggerFactory
29+
.AddConsole(LogLevel.Trace);
30+
31+
services.AddSingleton<ILoggerFactory>(loggerFactory);
32+
33+
services.AddDbContext<AppDbContext>(options =>
34+
{
35+
options.UseNpgsql(GetDbConnectionString());
36+
}, ServiceLifetime.Transient);
37+
38+
services.AddJsonApi<AppDbContext>(opt =>
39+
{
40+
opt.Namespace = "api/v1";
41+
opt.DefaultPageSize = 5;
42+
opt.IncludeTotalRecordCount = true;
43+
});
44+
45+
// custom authorization implementation
46+
var authServicMock = new Mock<IAuthorizationService>();
47+
authServicMock.SetupAllProperties();
48+
services.AddSingleton<IAuthorizationService>(authServicMock.Object);
49+
services.AddScoped<IEntityRepository<TodoItem>, AuthorizedTodoItemsRepository>();
50+
51+
services.AddDocumentationConfiguration(Config);
52+
53+
return services.BuildServiceProvider();
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)