Skip to content

Commit f3fd23a

Browse files
committed
Added more api test cases, DTOs
1 parent bfad48d commit f3fd23a

File tree

6 files changed

+194
-66
lines changed

6 files changed

+194
-66
lines changed

SeleniumTests/lib/helpers/BookStoreClient.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Net.Http.Json;
2+
using System.Text;
3+
using System.Text.Json;
24
using SeleniumTests.lib.config;
35
using SeleniumTests.lib.models;
46

@@ -15,24 +17,70 @@ public BookStoreClient()
1517

1618
public async Task<BooksResponseDto> GetAllBooksAsync()
1719
{
20+
Console.WriteLine("GET /Books");
1821
return await _client.GetFromJsonAsync<BooksResponseDto>("/BookStore/v1/Books")
1922
?? new BooksResponseDto();
2023
}
2124

2225
public async Task<BookDto> GetBookByIsbnAsync(string isbn)
2326
{
27+
Console.WriteLine($"GET /Book?ISBN={isbn}");
2428
return await _client.GetFromJsonAsync<BookDto>($"/BookStore/v1/Book?ISBN={isbn}")
2529
?? new BookDto();
2630
}
2731

2832
public async Task<HttpResponseMessage> CreateUserAsync(UserRequestDto user)
2933
{
34+
Console.WriteLine("POST /User");
3035
return await _client.PostAsJsonAsync("/Account/v1/User", user);
3136
}
3237

3338
public async Task<TokenResponseDto?> GenerateTokenAsync(UserRequestDto user)
3439
{
40+
Console.WriteLine("POST /GenerateToken");
3541
var res = await _client.PostAsJsonAsync("/Account/v1/GenerateToken", user);
3642
return await res.Content.ReadFromJsonAsync<TokenResponseDto>();
3743
}
44+
45+
public async Task<HttpResponseMessage> LoginAsync(UserRequestDto user)
46+
{
47+
Console.WriteLine("POST /Login");
48+
return await _client.PostAsJsonAsync("/Account/v1/Login", user);
49+
}
50+
51+
public async Task<HttpResponseMessage> DeleteBookAsync(string isbn, string userId, string token)
52+
{
53+
Console.WriteLine("DELETE /Book");
54+
var request = new HttpRequestMessage(HttpMethod.Delete, $"/BookStore/v1/Book");
55+
request.Headers.Add("Authorization", $"Bearer {token}");
56+
request.Content = new StringContent(JsonSerializer.Serialize(new
57+
{
58+
isbn,
59+
userId
60+
}), Encoding.UTF8, "application/json");
61+
62+
return await _client.SendAsync(request);
63+
}
64+
65+
public async Task<HttpResponseMessage> DeleteAllBooksAsync(string userId, string token)
66+
{
67+
Console.WriteLine("DELETE /Books (all)");
68+
var request = new HttpRequestMessage(HttpMethod.Delete, $"/BookStore/v1/Books");
69+
request.Headers.Add("Authorization", $"Bearer {token}");
70+
request.Content = new StringContent(JsonSerializer.Serialize(new { userId }), Encoding.UTF8, "application/json");
71+
return await _client.SendAsync(request);
72+
}
73+
74+
public async Task<HttpResponseMessage> AddBookToUserAsync(string userId, string isbn, string token)
75+
{
76+
Console.WriteLine("POST /Books (add)");
77+
var request = new HttpRequestMessage(HttpMethod.Post, "/BookStore/v1/Books");
78+
request.Headers.Add("Authorization", $"Bearer {token}");
79+
request.Content = new StringContent(JsonSerializer.Serialize(new
80+
{
81+
userId,
82+
collectionOfIsbns = new[] { new { isbn } }
83+
}), Encoding.UTF8, "application/json");
84+
return await _client.SendAsync(request);
85+
}
3886
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace SeleniumTests.lib.models;
2+
3+
public class CreateUserResponseDto
4+
{
5+
public string UserID { get; set; } = string.Empty;
6+
public string Username { get; set; } = string.Empty;
7+
public List<BookDto> Books { get; set; } = new();
8+
}

SeleniumTests/tests/ApiBookStoreTests.cs

Lines changed: 0 additions & 66 deletions
This file was deleted.

SeleniumTests/tests/api/AuthTests.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using SeleniumTests.lib.models;
2+
using SeleniumTests.tests.fixtures;
3+
4+
namespace SeleniumTests.tests.api;
5+
6+
[TestFixture]
7+
public class AuthTests : BookStoreFixture
8+
{
9+
[Test]
10+
public async Task CreateUser_ShouldReturn_201()
11+
{
12+
var user = new UserRequestDto
13+
{
14+
UserName = $"user_{Guid.NewGuid():N}",
15+
Password = "P@ssword123"
16+
};
17+
18+
var response = await Client.CreateUserAsync(user);
19+
Assert.That((int)response.StatusCode, Is.EqualTo(201));
20+
}
21+
22+
[Test]
23+
public async Task GenerateToken_ShouldReturn_ValidToken()
24+
{
25+
var user = new UserRequestDto
26+
{
27+
UserName = $"user_{Guid.NewGuid():N}",
28+
Password = "P@ssword123"
29+
};
30+
31+
await Client.CreateUserAsync(user);
32+
var token = await Client.GenerateTokenAsync(user);
33+
34+
Assert.That(token, Is.Not.Null);
35+
Assert.That(token!.Token, Is.Not.Empty);
36+
Assert.That(token.Status, Is.EqualTo("Success"));
37+
}
38+
39+
[Test]
40+
public async Task Login_WithInvalidCredentials_ShouldFail()
41+
{
42+
var user = new UserRequestDto
43+
{
44+
UserName = "invalid_user",
45+
Password = "wrongpass"
46+
};
47+
48+
var response = await Client.LoginAsync(user);
49+
Assert.That((int)response.StatusCode, Is.EqualTo(400));
50+
}
51+
52+
[Test]
53+
public async Task DeleteBooks_WithInvalidToken_ShouldFail()
54+
{
55+
var response = await Client.DeleteAllBooksAsync("fake-user-id", "invalid_token");
56+
Assert.That((int)response.StatusCode, Is.EqualTo(401));
57+
}
58+
}

SeleniumTests/tests/api/BookTests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System.Net.Http.Json;
2+
using SeleniumTests.lib.models;
3+
using SeleniumTests.tests.fixtures;
4+
5+
namespace SeleniumTests.tests.api;
6+
7+
[TestFixture]
8+
public class BookTests : BookStoreFixture
9+
{
10+
private UserRequestDto _user = null!;
11+
private string _token = null!;
12+
private string _userId = null!;
13+
14+
[SetUp]
15+
public async Task InitUser()
16+
{
17+
_user = new UserRequestDto
18+
{
19+
UserName = $"user_{Guid.NewGuid():N}",
20+
Password = "P@ssword123"
21+
};
22+
23+
var createRes = await Client.CreateUserAsync(_user);
24+
Assert.That((int)createRes.StatusCode, Is.EqualTo(201));
25+
26+
var responseBody = await createRes.Content.ReadFromJsonAsync<CreateUserResponseDto>();
27+
_userId = responseBody!.UserID;
28+
29+
var tokenRes = await Client.GenerateTokenAsync(_user);
30+
_token = tokenRes!.Token;
31+
Assert.That(_token, Is.Not.Empty);
32+
}
33+
34+
[Test]
35+
public async Task AddBookToUser_ShouldReturn201()
36+
{
37+
var books = await Client.GetAllBooksAsync();
38+
var isbn = books.Books.First().ISBN;
39+
40+
var addRes = await Client.AddBookToUserAsync(_userId, isbn, _token);
41+
Assert.That((int)addRes.StatusCode, Is.EqualTo(201));
42+
}
43+
44+
[Test]
45+
public async Task DeleteBookFromUser_ShouldReturn204()
46+
{
47+
var books = await Client.GetAllBooksAsync();
48+
var isbn = books.Books.First().ISBN;
49+
await Client.AddBookToUserAsync(_userId, isbn, _token);
50+
51+
var delRes = await Client.DeleteBookAsync(isbn, _userId, _token);
52+
Assert.That((int)delRes.StatusCode, Is.EqualTo(204));
53+
}
54+
55+
[Test]
56+
public async Task DeleteAllBooks_ShouldReturn204()
57+
{
58+
var books = await Client.GetAllBooksAsync();
59+
var isbn = books.Books.First().ISBN;
60+
await Client.AddBookToUserAsync(_userId, isbn, _token);
61+
62+
var delRes = await Client.DeleteAllBooksAsync(_userId, _token);
63+
Assert.That((int)delRes.StatusCode, Is.EqualTo(204));
64+
}
65+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using NUnit.Framework;
2+
using SeleniumTests.lib.helpers;
3+
4+
namespace SeleniumTests.tests.fixtures;
5+
6+
public class BookStoreFixture
7+
{
8+
protected BookStoreClient Client = null!;
9+
10+
[SetUp]
11+
public void SetupClient()
12+
{
13+
Client = new BookStoreClient();
14+
}
15+
}

0 commit comments

Comments
 (0)