diff --git a/.github/workflows/build-and-dockerize.yml b/.github/workflows/build-and-dockerize.yml index 0ea962c6c..d789b7960 100644 --- a/.github/workflows/build-and-dockerize.yml +++ b/.github/workflows/build-and-dockerize.yml @@ -13,7 +13,7 @@ jobs: # Label used to access the service container postgres: # Docker Hub image - image: postgres:17-alpine + image: postgres:18-alpine ports: - 5432:5432 # Provide the password for postgres diff --git a/BervProject.WebApi.Boilerplate.MigrationService/Worker.cs b/BervProject.WebApi.Boilerplate.MigrationService/Worker.cs index df663d0d9..45b245f74 100644 --- a/BervProject.WebApi.Boilerplate.MigrationService/Worker.cs +++ b/BervProject.WebApi.Boilerplate.MigrationService/Worker.cs @@ -1,9 +1,9 @@ +namespace BervProject.WebApi.Boilerplate.MigrationService; + using System.Diagnostics; -using BervProject.WebApi.Boilerplate.EntityFramework; +using EntityFramework; using Microsoft.EntityFrameworkCore; -namespace BervProject.WebApi.Boilerplate.MigrationService; - public class Worker : BackgroundService { public const string ActivitySourceName = "Migrations"; diff --git a/BervProject.WebApi.Boilerplate.ServiceDefaults/Extensions.cs b/BervProject.WebApi.Boilerplate.ServiceDefaults/Extensions.cs index 2a3f4e074..5d5b87205 100644 --- a/BervProject.WebApi.Boilerplate.ServiceDefaults/Extensions.cs +++ b/BervProject.WebApi.Boilerplate.ServiceDefaults/Extensions.cs @@ -3,7 +3,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.ServiceDiscovery; using OpenTelemetry; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; diff --git a/BervProject.WebApi.Boilerplate/ConfigModel/AWSConfiguration.cs b/BervProject.WebApi.Boilerplate/ConfigModel/AWSConfiguration.cs index c9e4e650a..4c2e04671 100644 --- a/BervProject.WebApi.Boilerplate/ConfigModel/AWSConfiguration.cs +++ b/BervProject.WebApi.Boilerplate/ConfigModel/AWSConfiguration.cs @@ -1,30 +1,38 @@ -namespace BervProject.WebApi.Boilerplate.ConfigModel -{ - public class AWSConfiguration - { - public AWSBasicConfiguration Basic { get; set; } - public AWSEmailConfiguration Email { get; set; } - public AWSDynamoConfiguration Dynamo { get; set; } - } - - public class AWSAuth - { - public string AccessKey { get; set; } - public string SecretKey { get; set; } - } +namespace BervProject.WebApi.Boilerplate.ConfigModel; - public class AWSBasicConfiguration - { - public AWSAuth Auth { get; set; } - } - - public class AWSDynamoConfiguration - { - public string Location { get; set; } - } +/// +/// AWS Config +/// +public class AwsConfiguration +{ + /// + /// Email + /// + public AwsEmailConfiguration Email { get; set; } + /// + /// Dynamo + /// + public AwsDynamoConfiguration Dynamo { get; set; } +} - public class AWSEmailConfiguration - { - public string Location { get; set; } - } +/// +/// AWS Dynamo Config +/// +public class AwsDynamoConfiguration +{ + /// + /// Location + /// + public string Location { get; set; } } + +/// +/// AWS Email Config +/// +public class AwsEmailConfiguration +{ + /// + /// Location + /// + public string Location { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/ConfigModel/AzureConfiguration.cs b/BervProject.WebApi.Boilerplate/ConfigModel/AzureConfiguration.cs index c33d426e8..6443a07c1 100644 --- a/BervProject.WebApi.Boilerplate/ConfigModel/AzureConfiguration.cs +++ b/BervProject.WebApi.Boilerplate/ConfigModel/AzureConfiguration.cs @@ -1,30 +1,68 @@ -namespace BervProject.WebApi.Boilerplate.ConfigModel -{ - public class AzureConfiguration - { - public AzureServiceBus ServiceBus { get; set; } - public AzureStorage Storage { get; set; } - } +namespace BervProject.WebApi.Boilerplate.ConfigModel; - public class AzureStorage - { - public StorageQueue Queue { get; set; } - public BlobStorage Blob { get; set; } - } +/// +/// Azure Config +/// +public class AzureConfiguration +{ + /// + /// Service Bus + /// + public AzureServiceBus ServiceBus { get; set; } + /// + /// Storage + /// + public AzureStorage Storage { get; set; } +} - public class BlobStorage - { - public string ContainerName { get; set; } - } +/// +/// Azure Storage +/// +public class AzureStorage +{ + /// + /// Queue + /// + public StorageQueue Queue { get; set; } + /// + /// Blob + /// + public BlobStorage Blob { get; set; } +} - public class StorageQueue - { - public string QueueName { get; set; } - } +/// +/// Blob +/// +public class BlobStorage +{ + /// + /// Container Name + /// + public string ContainerName { get; set; } +} - public class AzureServiceBus - { - public string QueueName { get; set; } - public string TopicName { get; set; } - } +/// +/// Queue +/// +public class StorageQueue +{ + /// + /// Queue Name + /// + public string QueueName { get; set; } } + +/// +/// Service Bus +/// +public class AzureServiceBus +{ + /// + /// Queue Name + /// + public string QueueName { get; set; } + /// + /// Topic Name + /// + public string TopicName { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Controllers/AWSS3Controller.cs b/BervProject.WebApi.Boilerplate/Controllers/AWSS3Controller.cs index 6ac684497..e5535583a 100644 --- a/BervProject.WebApi.Boilerplate/Controllers/AWSS3Controller.cs +++ b/BervProject.WebApi.Boilerplate/Controllers/AWSS3Controller.cs @@ -11,8 +11,8 @@ namespace BervProject.WebApi.Boilerplate.Controllers [ApiVersion("1.0")] public class SThreeController : ControllerBase { - private readonly IAWSS3Service _awsS3Service; - public SThreeController(IAWSS3Service awsS3Service) + private readonly IAwsS3Service _awsS3Service; + public SThreeController(IAwsS3Service awsS3Service) { _awsS3Service = awsS3Service; } diff --git a/BervProject.WebApi.Boilerplate/Controllers/NoteController.cs b/BervProject.WebApi.Boilerplate/Controllers/NoteController.cs index f25e118f7..60d1c1d95 100644 --- a/BervProject.WebApi.Boilerplate/Controllers/NoteController.cs +++ b/BervProject.WebApi.Boilerplate/Controllers/NoteController.cs @@ -2,6 +2,7 @@ using BervProject.WebApi.Boilerplate.Services; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; +using BervProject.WebApi.Boilerplate.Services.Azure; using Microsoft.AspNetCore.Http; namespace BervProject.WebApi.Boilerplate.Controllers diff --git a/BervProject.WebApi.Boilerplate/Entities/Book.cs b/BervProject.WebApi.Boilerplate/Entities/Book.cs index 71746b2c1..06eb8ff1d 100644 --- a/BervProject.WebApi.Boilerplate/Entities/Book.cs +++ b/BervProject.WebApi.Boilerplate/Entities/Book.cs @@ -1,13 +1,24 @@ -using System; +namespace BervProject.WebApi.Boilerplate.Entities; + +using System; using System.ComponentModel.DataAnnotations; -namespace BervProject.WebApi.Boilerplate.Entities +/// +/// Book Entity +/// +public class Book { - public class Book - { - public Guid Id { get; set; } - [Required] - public string Name { get; set; } - public virtual Publisher Publisher { get; set; } - } -} + /// + /// Id + /// + public Guid Id { get; set; } + /// + /// Name + /// + [Required] + public string Name { get; set; } + /// + /// Publisher + /// + public virtual Publisher Publisher { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Entities/Note.cs b/BervProject.WebApi.Boilerplate/Entities/Note.cs index 5d78f1c49..2dd5c65f0 100644 --- a/BervProject.WebApi.Boilerplate/Entities/Note.cs +++ b/BervProject.WebApi.Boilerplate/Entities/Note.cs @@ -1,18 +1,36 @@ +namespace BervProject.WebApi.Boilerplate.Entities; using System; using Azure; using Azure.Data.Tables; -namespace BervProject.WebApi.Boilerplate.Entities +/// +/// Note +/// +public class Note : ITableEntity { - public class Note : ITableEntity - { - public string PartitionKey { get; set; } - public string RowKey { get; set; } - public string Title { get; set; } - public string Message { get; set; } - public DateTimeOffset? Timestamp { get; set; } - public ETag ETag { get; set; } - } -} - + /// + /// Partition Key + /// + public string PartitionKey { get; set; } + /// + /// Row key + /// + public string RowKey { get; set; } + /// + /// Title + /// + public string Title { get; set; } + /// + /// Message + /// + public string Message { get; set; } + /// + /// Timestamp + /// + public DateTimeOffset? Timestamp { get; set; } + /// + /// ETag + /// + public ETag ETag { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Entities/Publisher.cs b/BervProject.WebApi.Boilerplate/Entities/Publisher.cs index 98214b2df..732e9aeec 100644 --- a/BervProject.WebApi.Boilerplate/Entities/Publisher.cs +++ b/BervProject.WebApi.Boilerplate/Entities/Publisher.cs @@ -1,16 +1,27 @@ -using System; +namespace BervProject.WebApi.Boilerplate.Entities; + +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace BervProject.WebApi.Boilerplate.Entities +/// +/// Publisher +/// +public class Publisher { - public class Publisher - { - public Guid Id { get; set; } - [Required] - public string Name { get; set; } - [JsonIgnore] - public virtual ICollection Books { get; set; } - } -} + /// + /// Id + /// + public Guid Id { get; set; } + /// + /// Name + /// + [Required] + public string Name { get; set; } + /// + /// Books + /// + [JsonIgnore] + public virtual ICollection Books { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/EntityFramework/BoilerplateDbContext.cs b/BervProject.WebApi.Boilerplate/EntityFramework/BoilerplateDbContext.cs index 29d509a98..9e2628690 100644 --- a/BervProject.WebApi.Boilerplate/EntityFramework/BoilerplateDbContext.cs +++ b/BervProject.WebApi.Boilerplate/EntityFramework/BoilerplateDbContext.cs @@ -3,21 +3,41 @@ namespace BervProject.WebApi.Boilerplate.EntityFramework { + /// + /// DB Context + /// public class BoilerplateDbContext : DbContext { + /// + /// Books + /// public DbSet Books { get; set; } + /// + /// Publishers + /// public DbSet Publishers { get; set; } + /// + /// Default Constructor + /// public BoilerplateDbContext() : base() { } + /// + /// Constructor with DbContextOptions + /// + /// DbContextOptions public BoilerplateDbContext(DbContextOptions options) : base(options) { } + /// + /// Adding relationship + /// + /// protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); diff --git a/BervProject.WebApi.Boilerplate/Extensions/SetupAWSExtension.cs b/BervProject.WebApi.Boilerplate/Extensions/SetupAWSExtension.cs index 610516bf2..44a3e9871 100644 --- a/BervProject.WebApi.Boilerplate/Extensions/SetupAWSExtension.cs +++ b/BervProject.WebApi.Boilerplate/Extensions/SetupAWSExtension.cs @@ -1,20 +1,28 @@ -namespace BervProject.WebApi.Boilerplate.Extenstions; +namespace BervProject.WebApi.Boilerplate.Extensions; + using Amazon.DynamoDBv2; using Amazon.S3; using Amazon.SimpleEmail; -using BervProject.WebApi.Boilerplate.Services.AWS; +using Services.AWS; using Microsoft.Extensions.DependencyInjection; -public static class SetupAWSExtension +/// +/// AWS Extension for setup all AWS Services +/// +public static class SetupAwsExtension { - public static void SetupAWS(this IServiceCollection services) + /// + /// Setup AWS Services + /// + /// + public static void SetupAws(this IServiceCollection services) { services.AddAWSService(); services.AddAWSService(); services.AddAWSService(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); } } diff --git a/BervProject.WebApi.Boilerplate/Extensions/SetupAzureExtension.cs b/BervProject.WebApi.Boilerplate/Extensions/SetupAzureExtension.cs index 0dc6a248b..6c19abc7e 100644 --- a/BervProject.WebApi.Boilerplate/Extensions/SetupAzureExtension.cs +++ b/BervProject.WebApi.Boilerplate/Extensions/SetupAzureExtension.cs @@ -1,16 +1,22 @@ -using Microsoft.Extensions.Configuration; - -namespace BervProject.WebApi.Boilerplate.Extenstions; +namespace BervProject.WebApi.Boilerplate.Extensions; using Entities; -using BervProject.WebApi.Boilerplate.Services.Azure; using Services; -using Microsoft.Extensions.DependencyInjection; +using BervProject.WebApi.Boilerplate.Services.Azure; using Microsoft.Extensions.Azure; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; - +/// +/// Extension for setup Azure services +/// public static class SetupAzureExtension { + /// + /// Setup Azure + /// + /// + /// public static void SetupAzure(this IServiceCollection services, ConfigurationManager config) { services.AddAzureClients(builder => diff --git a/BervProject.WebApi.Boilerplate/Models/EmailSendRequest.cs b/BervProject.WebApi.Boilerplate/Models/EmailSendRequest.cs index 1b49e3187..140b10583 100644 --- a/BervProject.WebApi.Boilerplate/Models/EmailSendRequest.cs +++ b/BervProject.WebApi.Boilerplate/Models/EmailSendRequest.cs @@ -1,11 +1,16 @@ -using System.Collections.Generic; +namespace BervProject.WebApi.Boilerplate.Models; + +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -namespace BervProject.WebApi.Boilerplate.Models +/// +/// Email Send Request +/// +public class EmailSendRequest { - public class EmailSendRequest - { - [Required] - public List To { get; set; } - } -} + /// + /// Destination + /// + [Required] + public List To { get; } = new(); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Models/MessageData.cs b/BervProject.WebApi.Boilerplate/Models/MessageData.cs index 98bb40467..e38157dbb 100644 --- a/BervProject.WebApi.Boilerplate/Models/MessageData.cs +++ b/BervProject.WebApi.Boilerplate/Models/MessageData.cs @@ -1,7 +1,12 @@ -namespace BervProject.WebApi.Boilerplate.Models +namespace BervProject.WebApi.Boilerplate.Models; + +/// +/// Message Data +/// +public class MessageData { - public class MessageData - { - public string Message { get; set; } - } -} + /// + /// Message + /// + public string Message { get; init; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Models/Request/UploadFile.cs b/BervProject.WebApi.Boilerplate/Models/Request/UploadFile.cs index 163572e0d..e448d90ae 100644 --- a/BervProject.WebApi.Boilerplate/Models/Request/UploadFile.cs +++ b/BervProject.WebApi.Boilerplate/Models/Request/UploadFile.cs @@ -1,12 +1,16 @@ -using Microsoft.AspNetCore.Http; -using Newtonsoft.Json; +namespace BervProject.WebApi.Boilerplate.Models.Request; + +using Microsoft.AspNetCore.Http; using System.ComponentModel.DataAnnotations; -namespace BervProject.WebApi.Boilerplate.Models.Request +/// +/// Upload File +/// +public class UploadFile { - public class UploadFile - { - [Required] - public IFormFile File { get; set; } - } -} + /// + /// File + /// + [Required] + public IFormFile File { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Models/Response/MessageSenderResponse.cs b/BervProject.WebApi.Boilerplate/Models/Response/MessageSenderResponse.cs index a99f88704..13fee5e8c 100644 --- a/BervProject.WebApi.Boilerplate/Models/Response/MessageSenderResponse.cs +++ b/BervProject.WebApi.Boilerplate/Models/Response/MessageSenderResponse.cs @@ -1,8 +1,16 @@ -namespace BervProject.WebApi.Boilerplate.Models.Response +namespace BervProject.WebApi.Boilerplate.Models.Response; + +/// +/// Message Sender Response +/// +public class MessageSenderResponse { - public class MessageSenderResponse - { - public bool IsSuccess { get; set; } - public string YourMessage { get; set; } - } -} + /// + /// Is Success + /// + public bool IsSuccess { get; set; } + /// + /// Your Message + /// + public string YourMessage { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Models/WeatherForecast.cs b/BervProject.WebApi.Boilerplate/Models/WeatherForecast.cs index fb14ee8c3..bbde7b777 100644 --- a/BervProject.WebApi.Boilerplate/Models/WeatherForecast.cs +++ b/BervProject.WebApi.Boilerplate/Models/WeatherForecast.cs @@ -1,15 +1,29 @@ +namespace BervProject.WebApi.Boilerplate.Models; + using System; -namespace BervProject.WebApi.Boilerplate.Models +/// +/// Weather Forecast +/// +public class WeatherForecast { - public class WeatherForecast - { - public DateTime Date { get; set; } + /// + /// Date + /// + public DateTime Date { get; set; } - public int TemperatureC { get; set; } + /// + /// Temperature in Celsius + /// + public int TemperatureC { get; set; } - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + /// + /// Temperature in F + /// + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - public string Summary { get; set; } - } -} + /// + /// Summary + /// + public string Summary { get; set; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Program.cs b/BervProject.WebApi.Boilerplate/Program.cs index 373b6187f..b60b095ef 100644 --- a/BervProject.WebApi.Boilerplate/Program.cs +++ b/BervProject.WebApi.Boilerplate/Program.cs @@ -4,7 +4,7 @@ using Autofac.Extensions.DependencyInjection; using BervProject.WebApi.Boilerplate.ConfigModel; using BervProject.WebApi.Boilerplate.EntityFramework; -using BervProject.WebApi.Boilerplate.Extenstions; +using BervProject.WebApi.Boilerplate.Extensions; using BervProject.WebApi.Boilerplate.Services; using BervProject.WebApi.Boilerplate.Services.Azure; using Hangfire; @@ -23,19 +23,18 @@ builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Logging.ClearProviders(); builder.Logging.SetMinimumLevel(LogLevel.Trace); -builder.Logging.AddNLog("Nlog.config"); -builder.Logging.AddNLogWeb(); +builder.Logging.AddNLogWeb("Nlog.config"); builder.Host.UseNLog(); // settings injection -var awsConfig = builder.Configuration.GetSection("AWS").Get(); +var awsConfig = builder.Configuration.GetSection("AWS").Get(); builder.Services.AddSingleton(awsConfig); var azureConfig = builder.Configuration.GetSection("Azure").Get(); builder.Services.AddSingleton(azureConfig); // aws services -builder.Services.SetupAWS(); +builder.Services.SetupAws(); // azure services builder.Services.SetupAzure(builder.Configuration); diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/AWSS3Service.cs b/BervProject.WebApi.Boilerplate/Services/AWS/AWSS3Service.cs deleted file mode 100644 index 4b1b6dbad..000000000 --- a/BervProject.WebApi.Boilerplate/Services/AWS/AWSS3Service.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Amazon.S3; -using Amazon.S3.Model; - -namespace BervProject.WebApi.Boilerplate.Services.AWS -{ - public class AWSS3Service : IAWSS3Service - { - private readonly IAmazonS3 _s3Client; - public AWSS3Service(IAmazonS3 amazonS3) - { - _s3Client = amazonS3; - } - public async Task UploadFile(IFormFile formFile) - { - var location = $"uploads/{formFile.FileName}"; - using var stream = formFile.OpenReadStream(); - var putRequest = new PutObjectRequest - { - Key = location, - BucketName = "upload-test-berv", - InputStream = stream, - AutoCloseStream = true, - ContentType = formFile.ContentType - }; - await _s3Client.PutObjectAsync(putRequest); - return location; - } - } -} diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/AwsS3Service.cs b/BervProject.WebApi.Boilerplate/Services/AWS/AwsS3Service.cs new file mode 100644 index 000000000..2a67b0a3f --- /dev/null +++ b/BervProject.WebApi.Boilerplate/Services/AWS/AwsS3Service.cs @@ -0,0 +1,40 @@ +namespace BervProject.WebApi.Boilerplate.Services.AWS; + +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Amazon.S3; +using Amazon.S3.Model; + +/// +public class AwsS3Service : IAwsS3Service +{ + private readonly IAmazonS3 _s3Client; + /// + /// Default constructor with dependency injections + /// + /// + public AwsS3Service(IAmazonS3 amazonS3) + { + _s3Client = amazonS3; + } + /// + /// Implementation of Upload File + /// + /// + /// + public async Task UploadFile(IFormFile formFile) + { + var location = $"uploads/{formFile.FileName}"; + await using var stream = formFile.OpenReadStream(); + var putRequest = new PutObjectRequest + { + Key = location, + BucketName = "upload-test-berv", + InputStream = stream, + AutoCloseStream = true, + ContentType = formFile.ContentType + }; + await _s3Client.PutObjectAsync(putRequest); + return location; + } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/DynamoDbServices.cs b/BervProject.WebApi.Boilerplate/Services/AWS/DynamoDbServices.cs index aeac75764..52345c48a 100644 --- a/BervProject.WebApi.Boilerplate/Services/AWS/DynamoDbServices.cs +++ b/BervProject.WebApi.Boilerplate/Services/AWS/DynamoDbServices.cs @@ -1,4 +1,6 @@ -using Amazon.DynamoDBv2; +namespace BervProject.WebApi.Boilerplate.Services.AWS; + +using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Microsoft.Extensions.Logging; using System; @@ -6,38 +8,44 @@ using System.Text.Json; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.AWS +/// +public class DynamoDbServices : IDynamoDbServices { - public class DynamoDbServices : IDynamoDbServices + private readonly IAmazonDynamoDB _dynamoClient; + private readonly ILogger _logger; + /// + /// Default constructor with dependency injections + /// + /// + /// + public DynamoDbServices(IAmazonDynamoDB amazonDynamoDb, ILogger logger) { - private readonly IAmazonDynamoDB _dynamoClient; - private readonly ILogger _logger; - public DynamoDbServices(IAmazonDynamoDB amazonDynamoDb, ILogger logger) - { - _logger = logger; - _dynamoClient = amazonDynamoDb; - } + _logger = logger; + _dynamoClient = amazonDynamoDb; + } - public async Task CreateObject() + /// + /// Create Object + /// + public async Task CreateObject() + { + var request = new PutItemRequest() { - var request = new PutItemRequest() + TableName = "dev-test", + Item = new Dictionary { - TableName = "dev-test", - Item = new Dictionary + { "Id", new AttributeValue + { + S = Guid.NewGuid().ToString() + }}, + { "Name", new AttributeValue { - { "Id", new AttributeValue - { - S = Guid.NewGuid().ToString() - }}, - { "Name", new AttributeValue - { - S = "Hello World!" - }} - } - }; - var response = await _dynamoClient.PutItemAsync(request); - string message = $"Response: {response.HttpStatusCode}, {JsonSerializer.Serialize(response.Attributes)}"; - _logger.LogInformation(message); - } + S = "Hello World!" + }} + } + }; + var response = await _dynamoClient.PutItemAsync(request); + string message = $"Response: {response.HttpStatusCode}, {JsonSerializer.Serialize(response.Attributes)}"; + _logger.LogInformation(message); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/EmailService.cs b/BervProject.WebApi.Boilerplate/Services/AWS/EmailService.cs index acbdcc027..dbbfb1b03 100644 --- a/BervProject.WebApi.Boilerplate/Services/AWS/EmailService.cs +++ b/BervProject.WebApi.Boilerplate/Services/AWS/EmailService.cs @@ -1,49 +1,57 @@ -using Amazon.SimpleEmail; +namespace BervProject.WebApi.Boilerplate.Services.AWS; + +using Amazon.SimpleEmail; using Amazon.SimpleEmail.Model; using Microsoft.Extensions.Logging; using System.Collections.Generic; using System.Text.Json; -using System.Text.Json.Serialization; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.AWS +/// +public class EmailService : IEmailService { - public class EmailService : IEmailService + private readonly IAmazonSimpleEmailService _emailClient; + private readonly ILogger _logger; + /// + /// Default Constructor with Dependency Injections + /// + /// + /// + public EmailService(ILogger logger, IAmazonSimpleEmailService emailClient) { - private readonly IAmazonSimpleEmailService _emailClient; - private readonly ILogger _logger; - public EmailService(ILogger logger, IAmazonSimpleEmailService emailClient) - { - _logger = logger; - _emailClient = emailClient; - } + _logger = logger; + _emailClient = emailClient; + } - public async Task SendEmail(List receiver) + /// + /// Send Email + /// + /// + public async Task SendEmail(List receiver) + { + var request = new SendEmailRequest() { - var request = new SendEmailRequest() + ReplyToAddresses = new List { "bervianto.leo@gmail.com" }, + Message = new Message() { - ReplyToAddresses = new List { "bervianto.leo@gmail.com" }, - Message = new Message() - { - Body = new Body(new Content("Hello World!")), - Subject = new Content("Stand by me") - }, - Destination = new Destination(receiver), - Source = "support@berviantoleo.my.id" - }; - var response = await _emailClient.SendEmailAsync(request); - string messageId = $"Message id: {response.MessageId}"; - _logger.LogDebug(messageId); - if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) - { - _logger.LogInformation("Finished Sent Email"); - } - else - { - _logger.LogWarning("There is a problem when sending email"); - string message = $"Error: {response.MessageId}:{response.HttpStatusCode}:{JsonSerializer.Serialize(response.ResponseMetadata.Metadata)}"; - _logger.LogWarning(message); - } + Body = new Body(new Content("Hello World!")), + Subject = new Content("Stand by me") + }, + Destination = new Destination(receiver), + Source = "support@berviantoleo.my.id" + }; + var response = await _emailClient.SendEmailAsync(request); + string messageId = $"Message id: {response.MessageId}"; + _logger.LogDebug(messageId); + if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) + { + _logger.LogInformation("Finished Sent Email"); + } + else + { + _logger.LogWarning("There is a problem when sending email"); + string message = $"Error: {response.MessageId}:{response.HttpStatusCode}:{JsonSerializer.Serialize(response.ResponseMetadata.Metadata)}"; + _logger.LogWarning(message); } } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/IAWSS3Service.cs b/BervProject.WebApi.Boilerplate/Services/AWS/IAWSS3Service.cs deleted file mode 100644 index 06a245ba0..000000000 --- a/BervProject.WebApi.Boilerplate/Services/AWS/IAWSS3Service.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; - -namespace BervProject.WebApi.Boilerplate.Services.AWS -{ - public interface IAWSS3Service - { - Task UploadFile(IFormFile formFile); - } -} diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/IAwsS3Service.cs b/BervProject.WebApi.Boilerplate/Services/AWS/IAwsS3Service.cs new file mode 100644 index 000000000..2a460c223 --- /dev/null +++ b/BervProject.WebApi.Boilerplate/Services/AWS/IAwsS3Service.cs @@ -0,0 +1,17 @@ +namespace BervProject.WebApi.Boilerplate.Services.AWS; + +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +/// +/// AWS S3 Service Interface +/// +public interface IAwsS3Service +{ + /// + /// Upload File + /// + /// + /// + Task UploadFile(IFormFile formFile); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/IDynamoDbServices.cs b/BervProject.WebApi.Boilerplate/Services/AWS/IDynamoDbServices.cs index 35bdad162..0e6008a91 100644 --- a/BervProject.WebApi.Boilerplate/Services/AWS/IDynamoDbServices.cs +++ b/BervProject.WebApi.Boilerplate/Services/AWS/IDynamoDbServices.cs @@ -1,9 +1,15 @@ -using System.Threading.Tasks; +namespace BervProject.WebApi.Boilerplate.Services.AWS; -namespace BervProject.WebApi.Boilerplate.Services.AWS +using System.Threading.Tasks; + +/// +/// Dynamo DB Service Interface +/// +public interface IDynamoDbServices { - public interface IDynamoDbServices - { - Task CreateObject(); - } -} + /// + /// Create an object + /// + /// + Task CreateObject(); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/AWS/IEmailService.cs b/BervProject.WebApi.Boilerplate/Services/AWS/IEmailService.cs index b44e331f4..a017cd323 100644 --- a/BervProject.WebApi.Boilerplate/Services/AWS/IEmailService.cs +++ b/BervProject.WebApi.Boilerplate/Services/AWS/IEmailService.cs @@ -1,10 +1,17 @@ -using System.Collections.Generic; +namespace BervProject.WebApi.Boilerplate.Services.AWS; + +using System.Collections.Generic; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.AWS +/// +/// Email Service Interface +/// +public interface IEmailService { - public interface IEmailService - { - Task SendEmail(List receiver); - } -} + /// + /// Send Email + /// + /// + /// + Task SendEmail(List receiver); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/AzureQueueServices.cs b/BervProject.WebApi.Boilerplate/Services/Azure/AzureQueueServices.cs index 7fd9bd82f..8366d8acf 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/AzureQueueServices.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/AzureQueueServices.cs @@ -1,42 +1,50 @@ using Azure.Messaging.ServiceBus; -using BervProject.WebApi.Boilerplate.ConfigModel; + +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using ConfigModel; using Microsoft.Extensions.Logging; using System; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.Azure +/// +public class AzureQueueServices : IAzureQueueServices { - public class AzureQueueServices : IAzureQueueServices + private readonly string _queueName; + private readonly ServiceBusSender _serviceBusSender; + private readonly ILogger _logger; + /// + /// Default constructor with dependency injections + /// + /// + /// + /// + public AzureQueueServices(AzureConfiguration azureConfiguration, ILogger logger, ServiceBusClient serviceBusClient) + { + _logger = logger; + _queueName = azureConfiguration.ServiceBus.QueueName; + _serviceBusSender = serviceBusClient.CreateSender(_queueName); + } + + /// + public async Task SendMessage(string message) { - private readonly string _queueName; - private readonly ServiceBusSender _serviceBusSender; - private readonly ILogger _logger; - public AzureQueueServices(AzureConfiguration azureConfiguration, ILogger logger, ServiceBusClient serviceBusClient) + try { - _logger = logger; - _queueName = azureConfiguration.ServiceBus.QueueName; - _serviceBusSender = serviceBusClient.CreateSender(_queueName); + var messageQueue = new ServiceBusMessage(message); + _logger.LogDebug($"Sending message: {message}"); + await _serviceBusSender.SendMessageAsync(messageQueue); + _logger.LogDebug($"Sent message: {message}"); + return true; } - - public async Task SendMessage(string message) + catch (Exception ex) + { + _logger.LogError(ex.ToString()); + return false; + } + finally { - try - { - var messageQueue = new ServiceBusMessage(message); - _logger.LogDebug($"Sending message: {message}"); - await _serviceBusSender.SendMessageAsync(messageQueue); - _logger.LogDebug($"Sent message: {message}"); - return true; - } - catch (Exception ex) - { - _logger.LogError(ex.ToString()); - return false; - } - finally - { - await _serviceBusSender.CloseAsync(); - } + await _serviceBusSender.CloseAsync(); } } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/AzureStorageQueueService.cs b/BervProject.WebApi.Boilerplate/Services/Azure/AzureStorageQueueService.cs index 69c07433c..0e7faf0f8 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/AzureStorageQueueService.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/AzureStorageQueueService.cs @@ -1,85 +1,88 @@ using Azure.Storage.Queues; -using BervProject.WebApi.Boilerplate.ConfigModel; + +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using ConfigModel; using Microsoft.Extensions.Logging; using System; -namespace BervProject.WebApi.Boilerplate.Services.Azure +/// +public class AzureStorageQueueService : IAzureStorageQueueService { - public class AzureStorageQueueService : IAzureStorageQueueService - { - private readonly ILogger _logger; - private readonly QueueClient _queueClient; - private readonly string _queueName; + private readonly ILogger _logger; + private readonly QueueClient _queueClient; + private readonly string _queueName; - public AzureStorageQueueService(ILogger logger, - AzureConfiguration azureConfiguration, - QueueServiceClient queueServiceClient) - { - _logger = logger; - _queueName = azureConfiguration.Storage.Queue.QueueName; - _queueClient = queueServiceClient.GetQueueClient(_queueName); - _queueClient.CreateIfNotExists(); - } + /// + /// Default constructor with dependency injections + /// + /// + /// + /// + public AzureStorageQueueService(ILogger logger, + AzureConfiguration azureConfiguration, + QueueServiceClient queueServiceClient) + { + _logger = logger; + _queueName = azureConfiguration.Storage.Queue.QueueName; + _queueClient = queueServiceClient.GetQueueClient(_queueName); + _queueClient.CreateIfNotExists(); + } - public string ReceiveMessage() + /// + public string ReceiveMessage() + { + try { - try + if (_queueClient.Exists()) { - if (_queueClient.Exists()) - { - var response = _queueClient.ReceiveMessage(); - var message = response?.Value; - if (message != null) - { - var textMessage = message.Body.ToString(); - _logger.LogDebug($"Get message from {_queueName}:{message.MessageId}: {textMessage}"); - _logger.LogDebug($"Message {message.MessageId} deqeue from {_queueName}"); - var responseDelete = _queueClient.DeleteMessage(message.MessageId, message.PopReceipt); - _logger.LogDebug($"Message finished deqeue from {_queueName}: {responseDelete.ClientRequestId}"); - return textMessage; - } - else - { - _logger.LogDebug($"Empty message at {_queueName}"); - return null; - } - } - else + var response = _queueClient.ReceiveMessage(); + var message = response?.Value; + if (message != null) { - _logger.LogWarning($"{_queueName} is not exists"); - return null; + var textMessage = message.Body.ToString(); + _logger.LogDebug($"Get message from {_queueName}:{message.MessageId}: {textMessage}"); + _logger.LogDebug($"Message {message.MessageId} deqeue from {_queueName}"); + var responseDelete = _queueClient.DeleteMessage(message.MessageId, message.PopReceipt); + _logger.LogDebug($"Message finished deqeue from {_queueName}: {responseDelete.ClientRequestId}"); + return textMessage; } - } - catch (Exception ex) - { - _logger.LogError(ex, "Something Error, ignoring"); + + _logger.LogDebug($"Empty message at {_queueName}"); return null; } + + _logger.LogWarning($"{_queueName} is not exists"); + return null; } + catch (Exception ex) + { + _logger.LogError(ex, "Something Error, ignoring"); + return null; + } + } - public bool SendMessage(string message) + /// + public bool SendMessage(string message) + { + try { - try + if (_queueClient.Exists()) { - if (_queueClient.Exists()) - { - _logger.LogDebug($"Sending message: {message} at {_queueName}"); - var response = _queueClient.SendMessage(message); - var messageId = response?.Value?.MessageId; - _logger.LogDebug($"Sent message to {_queueName} with id: {messageId}"); - return true; - } - else - { - _logger.LogWarning($"{_queueName} is not exists"); - return false; - } - } - catch (Exception ex) - { - _logger.LogError(ex.ToString()); - return false; + _logger.LogDebug($"Sending message: {message} at {_queueName}"); + var response = _queueClient.SendMessage(message); + var messageId = response?.Value?.MessageId; + _logger.LogDebug($"Sent message to {_queueName} with id: {messageId}"); + return true; } + + _logger.LogWarning($"{_queueName} is not exists"); + return false; + } + catch (Exception ex) + { + _logger.LogError(ex.ToString()); + return false; } } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/AzureTableStorageService.cs b/BervProject.WebApi.Boilerplate/Services/Azure/AzureTableStorageService.cs index b5259305d..6365d8cc3 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/AzureTableStorageService.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/AzureTableStorageService.cs @@ -1,50 +1,58 @@ using Azure.Data.Tables; -using BervProject.WebApi.Boilerplate.ConfigModel; + +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using ConfigModel; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.Logging; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.Azure -{ - public class AzureTableStorageService : IAzureTableStorageService +/// +public class AzureTableStorageService : IAzureTableStorageService where T : class, ITableEntity, new() - { - private readonly ILogger> _logger; - private readonly TableServiceClient _tableServiceClient; - private readonly string _tableName; - public AzureTableStorageService(ILogger> logger, - AzureConfiguration azureConfiguration, - TableServiceClient tableServiceClient) - { - _logger = logger; - _tableServiceClient = tableServiceClient; - _tableName = typeof(T).ShortDisplayName(); - } +{ + private readonly ILogger> _logger; + private readonly TableServiceClient _tableServiceClient; + private readonly string _tableName; - public async Task CreateTableAsync() - { - _logger.LogInformation($"Creating table: {_tableName}"); - await _tableServiceClient.CreateTableIfNotExistsAsync(_tableName); - _logger.LogInformation($"{_tableName} created"); - } + /// + /// Default Constructor with dependency injections + /// + /// + /// + public AzureTableStorageService(ILogger> logger, + TableServiceClient tableServiceClient) + { + _logger = logger; + _tableServiceClient = tableServiceClient; + _tableName = typeof(T).ShortDisplayName(); + } - public async Task UpsertAsync(T data) - { - var tableClient = _tableServiceClient.GetTableClient(_tableName); - var response = await tableClient.UpsertEntityAsync(data); - if (response.IsError) - { - _logger.LogError(response.ReasonPhrase); - } - } + /// + public async Task CreateTableAsync() + { + _logger.LogInformation($"Creating table: {_tableName}"); + await _tableServiceClient.CreateTableIfNotExistsAsync(_tableName); + _logger.LogInformation($"{_tableName} created"); + } - public async Task GetAsync(string partitionKey, string rowKey) + /// + public async Task UpsertAsync(T data) + { + var tableClient = _tableServiceClient.GetTableClient(_tableName); + var response = await tableClient.UpsertEntityAsync(data); + if (response.IsError) { - var tableClient = _tableServiceClient.GetTableClient(_tableName); - var response = await tableClient.GetEntityAsync(partitionKey, rowKey); - return response.Value; + _logger.LogError(response.ReasonPhrase); } } -} + /// + public async Task GetAsync(string partitionKey, string rowKey) + { + var tableClient = _tableServiceClient.GetTableClient(_tableName); + var response = await tableClient.GetEntityAsync(partitionKey, rowKey); + return response.Value; + } +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/BlobService.cs b/BervProject.WebApi.Boilerplate/Services/Azure/BlobService.cs index 4672dbb61..7c7c48a78 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/BlobService.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/BlobService.cs @@ -1,71 +1,81 @@ using Azure.Storage.Blobs; -using BervProject.WebApi.Boilerplate.ConfigModel; + +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using ConfigModel; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System.Collections.Generic; -namespace BervProject.WebApi.Boilerplate.Services.Azure +/// +public class BlobService : IBlobService { - public class BlobService : IBlobService + private readonly ILogger _logger; + private readonly BlobContainerClient _blobContainerClient; + private readonly string _containerName; + /// + /// Default constructor with dependency injections + /// + /// + /// + /// + public BlobService(ILogger logger, AzureConfiguration azureConfiguration, BlobServiceClient blobServiceClient) { - private readonly ILogger _logger; - private readonly BlobContainerClient _blobContainerClient; - private readonly string _containerName; - public BlobService(ILogger logger, AzureConfiguration azureConfiguration, BlobServiceClient blobServiceClient) - { - _logger = logger; - _containerName = azureConfiguration.Storage.Blob.ContainerName; - _blobContainerClient = blobServiceClient.GetBlobContainerClient(_containerName); - } + _logger = logger; + _containerName = azureConfiguration.Storage.Blob.ContainerName; + _blobContainerClient = blobServiceClient.GetBlobContainerClient(_containerName); + } - public void CreateStorageContainer() - { - _logger.LogDebug($"Create Blob Container {_containerName}"); - _blobContainerClient.CreateIfNotExists(); - _logger.LogDebug($"Blob Container {_containerName} created"); - } + /// + public void CreateStorageContainer() + { + _logger.LogDebug($"Create Blob Container {_containerName}"); + _blobContainerClient.CreateIfNotExists(); + _logger.LogDebug($"Blob Container {_containerName} created"); + } - public List> GetBlobsInfo() + /// + public List> GetBlobsInfo() + { + var list = new List>(); + if (_blobContainerClient.Exists()) { - var list = new List>(); - if (_blobContainerClient.Exists()) + var blobs = _blobContainerClient.GetBlobs(); + foreach (var blob in blobs) { - var blobs = _blobContainerClient.GetBlobs(); - foreach (var blob in blobs) + _logger.LogDebug($"{blob.Name} --> Created On: {blob.Properties.CreatedOn:YYYY-MM-dd HH:mm:ss} Size: {blob.Properties.ContentLength}"); + list.Add(new Dictionary { - _logger.LogDebug($"{blob.Name} --> Created On: {blob.Properties.CreatedOn:YYYY-MM-dd HH:mm:ss} Size: {blob.Properties.ContentLength}"); - list.Add(new Dictionary - { - { "name", blob.Name }, - { "createdDate", blob.Properties.CreatedOn?.ToString() }, - { "size", blob.Properties.ContentLength?.ToString() }, - { "version", blob.VersionId }, - { "deleted", blob.Deleted.ToString() } - }); - } - } - else - { - _logger.LogWarning($"Can't get data, container {_containerName} not created yet"); + { "name", blob.Name }, + { "createdDate", blob.Properties.CreatedOn?.ToString() }, + { "size", blob.Properties.ContentLength?.ToString() }, + { "version", blob.VersionId }, + { "deleted", blob.Deleted.ToString() } + }); } - return list; } + else + { + _logger.LogWarning($"Can't get data, container {_containerName} not created yet"); + } + return list; + } - public void UploadFile(IFormFile formFile) + /// + public void UploadFile(IFormFile formFile) + { + if (_blobContainerClient.Exists()) { - if (_blobContainerClient.Exists()) - { - var fileName = formFile.FileName; - BlobClient blobClient = _blobContainerClient.GetBlobClient(fileName); - using var stream = formFile.OpenReadStream(); - _logger.LogDebug($"Uploading {fileName}"); - blobClient.Upload(stream, true); - _logger.LogDebug($"{fileName} uploaded"); - } - else - { - _logger.LogWarning($"Can't upload, container {_containerName} not created yet"); - } + var fileName = formFile.FileName; + BlobClient blobClient = _blobContainerClient.GetBlobClient(fileName); + using var stream = formFile.OpenReadStream(); + _logger.LogDebug($"Uploading {fileName}"); + blobClient.Upload(stream, true); + _logger.LogDebug($"{fileName} uploaded"); + } + else + { + _logger.LogWarning($"Can't upload, container {_containerName} not created yet"); } } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/IAzureQueueServices.cs b/BervProject.WebApi.Boilerplate/Services/Azure/IAzureQueueServices.cs index 7c1cf4a8a..767026f6d 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/IAzureQueueServices.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/IAzureQueueServices.cs @@ -1,9 +1,16 @@ -using System.Threading.Tasks; +namespace BervProject.WebApi.Boilerplate.Services.Azure; -namespace BervProject.WebApi.Boilerplate.Services.Azure +using System.Threading.Tasks; + +/// +/// Azure Queue Service +/// +public interface IAzureQueueServices { - public interface IAzureQueueServices - { - Task SendMessage(string message); - } -} + /// + /// Send Message + /// + /// + /// + Task SendMessage(string message); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/IAzureStorageQueueService.cs b/BervProject.WebApi.Boilerplate/Services/Azure/IAzureStorageQueueService.cs index 4e1b5330d..1ee763ff4 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/IAzureStorageQueueService.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/IAzureStorageQueueService.cs @@ -1,8 +1,19 @@ -namespace BervProject.WebApi.Boilerplate.Services.Azure +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +/// +/// Azure Storage Queue Service +/// +public interface IAzureStorageQueueService { - public interface IAzureStorageQueueService - { - bool SendMessage(string message); - string ReceiveMessage(); - } -} + /// + /// Send Message + /// + /// + /// + bool SendMessage(string message); + /// + /// Receive Message + /// + /// + string ReceiveMessage(); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/IAzureTableStorageService.cs b/BervProject.WebApi.Boilerplate/Services/Azure/IAzureTableStorageService.cs index 835af6483..6408a373b 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/IAzureTableStorageService.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/IAzureTableStorageService.cs @@ -1,10 +1,29 @@ -namespace BervProject.WebApi.Boilerplate.Services; - using System.Threading.Tasks; +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +/// +/// Azure Table Storage Service +/// +/// public interface IAzureTableStorageService { + /// + /// Create Table + /// + /// Task CreateTableAsync(); + /// + /// Upsert + /// + /// + /// Task UpsertAsync(T data); + /// + /// Get Data + /// + /// + /// + /// Task GetAsync(string partitionKey, string rowKey); } \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/IBlobService.cs b/BervProject.WebApi.Boilerplate/Services/Azure/IBlobService.cs index da436a1ad..06e8765bb 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/IBlobService.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/IBlobService.cs @@ -1,12 +1,25 @@ -using Microsoft.AspNetCore.Http; +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using Microsoft.AspNetCore.Http; using System.Collections.Generic; -namespace BervProject.WebApi.Boilerplate.Services.Azure +/// +/// Azure Blob Service +/// +public interface IBlobService { - public interface IBlobService - { - void CreateStorageContainer(); - List> GetBlobsInfo(); - void UploadFile(IFormFile formFile); - } -} + /// + /// Create Container + /// + void CreateStorageContainer(); + /// + /// Get Blobs Info + /// + /// + List> GetBlobsInfo(); + /// + /// Upload File + /// + /// + void UploadFile(IFormFile formFile); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusQueueConsumer.cs b/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusQueueConsumer.cs index e617baab8..bc28b8b56 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusQueueConsumer.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusQueueConsumer.cs @@ -1,10 +1,19 @@ -using System.Threading.Tasks; +namespace BervProject.WebApi.Boilerplate.Services.Azure; -namespace BervProject.WebApi.Boilerplate.Services.Azure +using System.Threading.Tasks; + +/// +/// Service Bus Queue Consumer +/// +public interface IServiceBusQueueConsumer { - public interface IServiceBusQueueConsumer - { - void RegisterOnMessageHandlerAndReceiveMessages(); - Task CloseQueueAsync(); - } -} + /// + /// Register event + /// + void RegisterOnMessageHandlerAndReceiveMessages(); + /// + /// Close Queue + /// + /// + Task CloseQueueAsync(); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusTopicSubscription.cs b/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusTopicSubscription.cs index 0d211509e..61cef9a5f 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusTopicSubscription.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/IServiceBusTopicSubscription.cs @@ -1,10 +1,19 @@ -using System.Threading.Tasks; +namespace BervProject.WebApi.Boilerplate.Services.Azure; -namespace BervProject.WebApi.Boilerplate.Services.Azure +using System.Threading.Tasks; + +/// +/// Service Bus Topic Sub +/// +public interface IServiceBusTopicSubscription { - public interface IServiceBusTopicSubscription - { - void RegisterOnMessageHandlerAndReceiveMessages(); - Task CloseSubscriptionClientAsync(); - } -} + /// + /// Receive topic registration + /// + void RegisterOnMessageHandlerAndReceiveMessages(); + /// + /// Close topic subs + /// + /// + Task CloseSubscriptionClientAsync(); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/ITopicServices.cs b/BervProject.WebApi.Boilerplate/Services/Azure/ITopicServices.cs index babf18b6a..f0039b0ac 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/ITopicServices.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/ITopicServices.cs @@ -1,9 +1,16 @@ -using System.Threading.Tasks; +namespace BervProject.WebApi.Boilerplate.Services.Azure; -namespace BervProject.WebApi.Boilerplate.Services.Azure +using System.Threading.Tasks; + +/// +/// Topic Service +/// +public interface ITopicServices { - public interface ITopicServices - { - Task SendTopic(string message); - } -} + /// + /// Sending topic + /// + /// + /// + Task SendTopic(string message); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusQueueConsumer.cs b/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusQueueConsumer.cs index a33d05c88..a28a9a404 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusQueueConsumer.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusQueueConsumer.cs @@ -1,67 +1,77 @@ using Azure.Messaging.ServiceBus; -using BervProject.WebApi.Boilerplate.ConfigModel; + +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using ConfigModel; using Microsoft.Extensions.Logging; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.Azure +/// +public class ServiceBusQueueConsumer : IServiceBusQueueConsumer { - public class ServiceBusQueueConsumer : IServiceBusQueueConsumer + private readonly ILogger _logger; + private readonly string _queueName; + private readonly ServiceBusProcessor _serviceBusProcessor; + private readonly IProcessData _processData; + /// + /// Default constructor with dependency injections + /// + /// + /// + /// + /// + public ServiceBusQueueConsumer(ILogger logger, + IProcessData processData, + AzureConfiguration azureConfiguration, + ServiceBusClient serviceBusClient) { - private readonly ILogger _logger; - private readonly string _queueName; - private readonly ServiceBusProcessor _serviceBusProcessor; - private readonly IProcessData _processData; - public ServiceBusQueueConsumer(ILogger logger, - IProcessData processData, - AzureConfiguration azureConfiguration, - ServiceBusClient serviceBusClient) + _logger = logger; + _processData = processData; + _queueName = azureConfiguration.ServiceBus.QueueName; + var options = new ServiceBusProcessorOptions { - _logger = logger; - _processData = processData; - _queueName = azureConfiguration.ServiceBus.QueueName; - var options = new ServiceBusProcessorOptions - { - // By default or when AutoCompleteMessages is set to true, the processor will complete the message after executing the message handler - // Set AutoCompleteMessages to false to [settle messages](https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock) on your own. - // In both cases, if the message handler throws an exception without settling the message, the processor will abandon the message. - AutoCompleteMessages = false, + // By default or when AutoCompleteMessages is set to true, the processor will complete the message after executing the message handler + // Set AutoCompleteMessages to false to [settle messages](https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock) on your own. + // In both cases, if the message handler throws an exception without settling the message, the processor will abandon the message. + AutoCompleteMessages = false, - // I can also allow for multi-threading - MaxConcurrentCalls = 2 - }; - _serviceBusProcessor = serviceBusClient.CreateProcessor(_queueName, options); - } + // I can also allow for multi-threading + MaxConcurrentCalls = 2 + }; + _serviceBusProcessor = serviceBusClient.CreateProcessor(_queueName, options); + } - public void RegisterOnMessageHandlerAndReceiveMessages() - { - _logger.LogDebug($"Register queue for {_queueName}"); - _serviceBusProcessor.ProcessMessageAsync += MessageHandler; - _serviceBusProcessor.ProcessErrorAsync += ErrorHandler; - _logger.LogDebug($"Registered queue for {_queueName}"); - } + /// + public void RegisterOnMessageHandlerAndReceiveMessages() + { + _logger.LogDebug($"Register queue for {_queueName}"); + _serviceBusProcessor.ProcessMessageAsync += MessageHandler; + _serviceBusProcessor.ProcessErrorAsync += ErrorHandler; + _logger.LogDebug($"Registered queue for {_queueName}"); + } - private async Task MessageHandler(ProcessMessageEventArgs args) - { - var myPayload = args.Message.Body.ToString(); - _processData.Process(myPayload); - await args.CompleteMessageAsync(args.Message); - } + private async Task MessageHandler(ProcessMessageEventArgs args) + { + var myPayload = args.Message.Body.ToString(); + _processData.Process(myPayload); + await args.CompleteMessageAsync(args.Message); + } - private Task ErrorHandler(ProcessErrorEventArgs args) - { - _logger.LogError(args.Exception, "Message handler encountered an exception"); + private Task ErrorHandler(ProcessErrorEventArgs args) + { + _logger.LogError(args.Exception, "Message handler encountered an exception"); - _logger.LogDebug($"- Error Source: {args.ErrorSource}"); - _logger.LogDebug($"- Entity Path: {args.EntityPath}"); - _logger.LogDebug($"- Identifier: {args.Identifier}"); - _logger.LogDebug($"- FullyQualifiedNamespace: {args.FullyQualifiedNamespace}"); + _logger.LogDebug($"- Error Source: {args.ErrorSource}"); + _logger.LogDebug($"- Entity Path: {args.EntityPath}"); + _logger.LogDebug($"- Identifier: {args.Identifier}"); + _logger.LogDebug($"- FullyQualifiedNamespace: {args.FullyQualifiedNamespace}"); - return Task.CompletedTask; - } + return Task.CompletedTask; + } - public async Task CloseQueueAsync() - { - await _serviceBusProcessor.CloseAsync(); - } + /// + public async Task CloseQueueAsync() + { + await _serviceBusProcessor.CloseAsync(); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusTopicSubscription.cs b/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusTopicSubscription.cs index 1c797177e..c0e381044 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusTopicSubscription.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/ServiceBusTopicSubscription.cs @@ -1,74 +1,79 @@ -using Amazon.Runtime.Internal; -using Azure.Messaging.ServiceBus; -using BervProject.WebApi.Boilerplate.ConfigModel; -using Microsoft.Azure.ServiceBus; +using Azure.Messaging.ServiceBus; + +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using ConfigModel; using Microsoft.Extensions.Logging; -using System.Diagnostics; -using System.Text; -using System.Threading; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.Azure +/// +public class ServiceBusTopicSubscription : IServiceBusTopicSubscription { - public class ServiceBusTopicSubscription : IServiceBusTopicSubscription + private readonly ILogger _logger; + private readonly string _topicName; + private readonly string _topicSubscription = "topicSubscriptionRandom"; + private readonly ServiceBusProcessor _serviceBusProcessor; + private readonly IProcessData _processData; + /// + /// Default constructor with dependency injections + /// + /// + /// + /// + /// + public ServiceBusTopicSubscription(ILogger logger, + IProcessData processData, + AzureConfiguration azureConfiguration, + ServiceBusClient serviceBusClient) { - private readonly ILogger _logger; - private readonly string _topicName; - private readonly string _topicSubscription = "topicSubscriptionRandom"; - private readonly ServiceBusProcessor _serviceBusProcessor; - private readonly IProcessData _processData; - public ServiceBusTopicSubscription(ILogger logger, - IProcessData processData, - AzureConfiguration azureConfiguration, - ServiceBusClient serviceBusClient) + _logger = logger; + _processData = processData; + _topicName = azureConfiguration.ServiceBus.TopicName; + var options = new ServiceBusProcessorOptions { - _logger = logger; - _processData = processData; - _topicName = azureConfiguration.ServiceBus.TopicName; - var options = new ServiceBusProcessorOptions - { - // By default or when AutoCompleteMessages is set to true, the processor will complete the message after executing the message handler - // Set AutoCompleteMessages to false to [settle messages](https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock) on your own. - // In both cases, if the message handler throws an exception without settling the message, the processor will abandon the message. - AutoCompleteMessages = false, + // By default or when AutoCompleteMessages is set to true, the processor will complete the message after executing the message handler + // Set AutoCompleteMessages to false to [settle messages](https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock) on your own. + // In both cases, if the message handler throws an exception without settling the message, the processor will abandon the message. + AutoCompleteMessages = false, - // I can also allow for multi-threading - MaxConcurrentCalls = 2 - }; - _serviceBusProcessor = serviceBusClient.CreateProcessor(_topicName, options); - } + // I can also allow for multi-threading + MaxConcurrentCalls = 2 + }; + _serviceBusProcessor = serviceBusClient.CreateProcessor(_topicName, options); + } - public async Task CloseSubscriptionClientAsync() - { - await _serviceBusProcessor.CloseAsync(); - } + /// + public async Task CloseSubscriptionClientAsync() + { + await _serviceBusProcessor.CloseAsync(); + } - public void RegisterOnMessageHandlerAndReceiveMessages() - { + /// + public void RegisterOnMessageHandlerAndReceiveMessages() + { - _logger.LogDebug($"Register topic for {_topicName}/{_topicSubscription}"); - _serviceBusProcessor.ProcessMessageAsync += MessageHandler; - _serviceBusProcessor.ProcessErrorAsync += ErrorHandler; - _logger.LogDebug($"Registered topic for {_topicName}/{_topicSubscription}"); - } + _logger.LogDebug($"Register topic for {_topicName}/{_topicSubscription}"); + _serviceBusProcessor.ProcessMessageAsync += MessageHandler; + _serviceBusProcessor.ProcessErrorAsync += ErrorHandler; + _logger.LogDebug($"Registered topic for {_topicName}/{_topicSubscription}"); + } - private async Task MessageHandler(ProcessMessageEventArgs args) - { - var myPayload = args.Message.Body.ToString(); - _processData.Process(myPayload); - await args.CompleteMessageAsync(args.Message); - } + private async Task MessageHandler(ProcessMessageEventArgs args) + { + var myPayload = args.Message.Body.ToString(); + _processData.Process(myPayload); + await args.CompleteMessageAsync(args.Message); + } - private Task ErrorHandler(ProcessErrorEventArgs args) - { - _logger.LogError(args.Exception, "Message handler encountered an exception"); + private Task ErrorHandler(ProcessErrorEventArgs args) + { + _logger.LogError(args.Exception, "Message handler encountered an exception"); - _logger.LogDebug($"- Error Source: {args.ErrorSource}"); - _logger.LogDebug($"- Entity Path: {args.EntityPath}"); - _logger.LogDebug($"- Identifier: {args.Identifier}"); - _logger.LogDebug($"- FullyQualifiedNamespace: {args.FullyQualifiedNamespace}"); + _logger.LogDebug($"- Error Source: {args.ErrorSource}"); + _logger.LogDebug($"- Entity Path: {args.EntityPath}"); + _logger.LogDebug($"- Identifier: {args.Identifier}"); + _logger.LogDebug($"- FullyQualifiedNamespace: {args.FullyQualifiedNamespace}"); - return Task.CompletedTask; - } + return Task.CompletedTask; } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/Azure/TopicServices.cs b/BervProject.WebApi.Boilerplate/Services/Azure/TopicServices.cs index eb3dd0d08..2c7b7fee0 100644 --- a/BervProject.WebApi.Boilerplate/Services/Azure/TopicServices.cs +++ b/BervProject.WebApi.Boilerplate/Services/Azure/TopicServices.cs @@ -1,43 +1,50 @@ using Azure.Messaging.ServiceBus; -using BervProject.WebApi.Boilerplate.ConfigModel; -using Microsoft.Azure.ServiceBus; + +namespace BervProject.WebApi.Boilerplate.Services.Azure; + +using ConfigModel; using Microsoft.Extensions.Logging; using System; -using System.Text; using System.Threading.Tasks; -namespace BervProject.WebApi.Boilerplate.Services.Azure +/// +public class TopicServices : ITopicServices { - public class TopicServices : ITopicServices + private readonly string _topicName; + private readonly ServiceBusSender _serviceBusSender; + private readonly ILogger _logger; + /// + /// Default constructor with dependency injections + /// + /// + /// + /// + public TopicServices(AzureConfiguration azureConfiguration, ILogger logger, ServiceBusClient serviceBusClient) { - private readonly string _topicName; - private readonly ServiceBusSender _serviceBusSender; - private readonly ILogger _logger; - public TopicServices(AzureConfiguration azureConfiguration, ILogger logger, ServiceBusClient serviceBusClient) + _logger = logger; + _topicName = azureConfiguration.ServiceBus.TopicName; + _serviceBusSender = serviceBusClient.CreateSender(_topicName); + } + + /// + public async Task SendTopic(string message) + { + try + { + var encodedMessage = new ServiceBusMessage(message); + _logger.LogDebug($"Sending message: {message}"); + await _serviceBusSender.SendMessageAsync(encodedMessage); + _logger.LogDebug($"Sent message: {message}"); + return true; + } + catch (Exception ex) { - _logger = logger; - _topicName = azureConfiguration.ServiceBus.TopicName; - _serviceBusSender = serviceBusClient.CreateSender(_topicName); + _logger.LogError(ex.ToString()); + return false; } - public async Task SendTopic(string message) + finally { - try - { - var encodedMessage = new ServiceBusMessage(message); - _logger.LogDebug($"Sending message: {message}"); - await _serviceBusSender.SendMessageAsync(encodedMessage); - _logger.LogDebug($"Sent message: {message}"); - return true; - } - catch (Exception ex) - { - _logger.LogError(ex.ToString()); - return false; - } - finally - { - await _serviceBusSender.CloseAsync(); - } + await _serviceBusSender.CloseAsync(); } } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/CronService.cs b/BervProject.WebApi.Boilerplate/Services/CronService.cs index 7c1dab507..d6ad914c6 100644 --- a/BervProject.WebApi.Boilerplate/Services/CronService.cs +++ b/BervProject.WebApi.Boilerplate/Services/CronService.cs @@ -1,19 +1,28 @@ -using Microsoft.Extensions.Logging; +namespace BervProject.WebApi.Boilerplate.Services; -namespace BervProject.WebApi.Boilerplate.Services +using Microsoft.Extensions.Logging; + +/// +/// Cron Service +/// +public class CronService : ICronService { - public class CronService : ICronService + private readonly ILogger _logger; + /// + /// Cron Service Constructor with Dependency Injection + /// + /// + public CronService(ILoggerFactory loggerFactory) + { + _logger = loggerFactory.CreateLogger(); + } + /// + /// Hello World Cron + /// + public void HelloWorld() { - private readonly ILogger _logger; - public CronService(ILoggerFactory loggerFactory) - { - _logger = loggerFactory.CreateLogger(); - } - public void HelloWorld() - { - _logger.LogDebug("Run Cron"); - _logger.LogInformation("Hello World Cron!"); - _logger.LogDebug("Finished Run Cron"); - } + _logger.LogDebug("Run Cron"); + _logger.LogInformation("Hello World Cron!"); + _logger.LogDebug("Finished Run Cron"); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/ICronService.cs b/BervProject.WebApi.Boilerplate/Services/ICronService.cs index cfea02fe9..183554d6e 100644 --- a/BervProject.WebApi.Boilerplate/Services/ICronService.cs +++ b/BervProject.WebApi.Boilerplate/Services/ICronService.cs @@ -1,7 +1,12 @@ -namespace BervProject.WebApi.Boilerplate.Services +namespace BervProject.WebApi.Boilerplate.Services; + +/// +/// Interface Cron Service +/// +public interface ICronService { - public interface ICronService - { - public void HelloWorld(); - } -} + /// + /// Hello World method + /// + public void HelloWorld(); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/IProcessData.cs b/BervProject.WebApi.Boilerplate/Services/IProcessData.cs index 343c66f5f..c18ab0a0d 100644 --- a/BervProject.WebApi.Boilerplate/Services/IProcessData.cs +++ b/BervProject.WebApi.Boilerplate/Services/IProcessData.cs @@ -1,7 +1,13 @@ -namespace BervProject.WebApi.Boilerplate.Services +namespace BervProject.WebApi.Boilerplate.Services; + +/// +/// Interface Process Message +/// +public interface IProcessData { - public interface IProcessData - { - void Process(string message); - } -} + /// + /// Process message + /// + /// + void Process(string message); +} \ No newline at end of file diff --git a/BervProject.WebApi.Boilerplate/Services/ProcessData.cs b/BervProject.WebApi.Boilerplate/Services/ProcessData.cs index b1c1b9132..aa50aac40 100644 --- a/BervProject.WebApi.Boilerplate/Services/ProcessData.cs +++ b/BervProject.WebApi.Boilerplate/Services/ProcessData.cs @@ -1,18 +1,28 @@ -using Microsoft.Extensions.Logging; +namespace BervProject.WebApi.Boilerplate.Services; -namespace BervProject.WebApi.Boilerplate.Services +using Microsoft.Extensions.Logging; + +/// +/// Process Data Implementation +/// +public class ProcessData : IProcessData { - public class ProcessData : IProcessData + private readonly ILogger _logger; + /// + /// Constructor with dependency injections + /// + /// + public ProcessData(ILogger logger) + { + _logger = logger; + } + /// + /// Only logging + /// + /// + public void Process(string message) { - private readonly ILogger _logger; - public ProcessData(ILogger logger) - { - _logger = logger; - } - public void Process(string message) - { - _logger.LogDebug($"You get message: {message}"); - // TODO: another handler - } + _logger.LogDebug($"You get message: {message}"); + // TODO: another handler } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/BlobControllerTest.cs b/BervProject.WebApi.Integration.Test/BlobControllerTest.cs index 73da7c8c8..74878582c 100644 --- a/BervProject.WebApi.Integration.Test/BlobControllerTest.cs +++ b/BervProject.WebApi.Integration.Test/BlobControllerTest.cs @@ -1,35 +1,33 @@ +namespace BervProject.WebApi.Integration.Test; + using System.Net.Http.Json; -using BervProject.WebApi.Integration.Test.Fixtures; +using Fixtures; using Microsoft.AspNetCore.Mvc.Testing; -using Newtonsoft.Json.Linq; -namespace BervProject.WebApi.Integration.Test +[Collection("Webapp")] +public class BlobControllerTest { - [Collection("Webapp")] - public class BlobControllerTest + private readonly WebApplicationFactory _applicationFactory; + public BlobControllerTest(WebAppFixture webAppFixtures) + { + _applicationFactory = webAppFixtures.WebApp; + } + [Fact] + public async Task UploadBlobTest() { - private readonly WebApplicationFactory _applicationFactory; - public BlobControllerTest(WebAppFixture webAppFixtures) - { - this._applicationFactory = webAppFixtures.WebApp; - } - [Fact] - public async Task UploadBlobTest() - { - var client = _applicationFactory.CreateClient(); - var response = await client.PostAsync("/api/v1.0/blob/create", null); - Assert.True(response.IsSuccessStatusCode); - using var file1 = File.OpenRead(@"Docs/test.txt"); - using var content1 = new StreamContent(file1); - using var formData = new MultipartFormDataContent(); - formData.Add(content1, "file", "test.txt"); - response = await client.PostAsync("/api/v1.0/blob/upload", formData); - Assert.True(response.IsSuccessStatusCode); - response = await client.GetAsync("/api/v1.0/blob/list"); - Assert.True(response.IsSuccessStatusCode); - var data = await response.Content.ReadFromJsonAsync>>(); - Assert.NotNull(data); - Assert.Single(data); - } + var client = _applicationFactory.CreateClient(); + var response = await client.PostAsync("/api/v1.0/blob/create", null); + Assert.True(response.IsSuccessStatusCode); + using var file1 = File.OpenRead(@"Docs/test.txt"); + using var content1 = new StreamContent(file1); + using var formData = new MultipartFormDataContent(); + formData.Add(content1, "file", "test.txt"); + response = await client.PostAsync("/api/v1.0/blob/upload", formData); + Assert.True(response.IsSuccessStatusCode); + response = await client.GetAsync("/api/v1.0/blob/list"); + Assert.True(response.IsSuccessStatusCode); + var data = await response.Content.ReadFromJsonAsync>>(); + Assert.NotNull(data); + Assert.Single(data); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/Collections/WebAppCollection.cs b/BervProject.WebApi.Integration.Test/Collections/WebAppCollection.cs index d69c33a3f..5590bec68 100644 --- a/BervProject.WebApi.Integration.Test/Collections/WebAppCollection.cs +++ b/BervProject.WebApi.Integration.Test/Collections/WebAppCollection.cs @@ -1,12 +1,11 @@ -using BervProject.WebApi.Integration.Test.Fixtures; +namespace BervProject.WebApi.Integration.Test.Collections; -namespace BervProject.WebApi.Integration.Test.Collections +using Fixtures; + +[CollectionDefinition("Webapp")] +public class WebAppCollection : ICollectionFixture { - [CollectionDefinition("Webapp")] - public class WebAppCollection : ICollectionFixture - { - // This class has no code, and is never created. Its purpose is simply - // to be the place to apply [CollectionDefinition] and all the - // ICollectionFixture<> interfaces. - } -} + // This class has no code, and is never created. Its purpose is simply + // to be the place to apply [CollectionDefinition] and all the + // ICollectionFixture<> interfaces. +} \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/CronControllerTest.cs b/BervProject.WebApi.Integration.Test/CronControllerTest.cs index 489f94b89..dcc219189 100644 --- a/BervProject.WebApi.Integration.Test/CronControllerTest.cs +++ b/BervProject.WebApi.Integration.Test/CronControllerTest.cs @@ -1,61 +1,61 @@ -using BervProject.WebApi.Integration.Test.Fixtures; +namespace BervProject.WebApi.Integration.Test; + +using Fixtures; using Hangfire; using Microsoft.AspNetCore.Mvc.Testing; -namespace BervProject.WebApi.Integration.Test + +[Collection("Webapp")] +public class CronControllerTest : IDisposable { - [Collection("Webapp")] - public class CronControllerTest : IDisposable + private readonly WebApplicationFactory _applicationFactory; + private readonly List _registeredRecurring = new(); + public CronControllerTest(WebAppFixture webAppFixtures) { - private readonly WebApplicationFactory _applicationFactory; - private readonly List _registeredRecurring = new List(); - public CronControllerTest(WebAppFixture webAppFixtures) - { - this._applicationFactory = webAppFixtures.WebApp; - } + _applicationFactory = webAppFixtures.WebApp; + } - public void Dispose() - { - RemoveRecurringJob(); - } + public void Dispose() + { + RemoveRecurringJob(); + } - private void RemoveRecurringJob() + private void RemoveRecurringJob() + { + var cronClient = (IRecurringJobManager?)this._applicationFactory.Services.GetService(typeof(IRecurringJobManager)); + if (cronClient != null) { - var cronClient = (IRecurringJobManager?)this._applicationFactory.Services.GetService(typeof(IRecurringJobManager)); - if (cronClient != null) + foreach (var cronId in _registeredRecurring) { - foreach (var cronId in _registeredRecurring) - { - cronClient.RemoveIfExists(cronId); - } + cronClient.RemoveIfExists(cronId); } } + } - [Fact] - public async Task SuccessCreateCronOnceTest() + [Fact] + public async Task SuccessCreateCronOnceTest() + { + var client = _applicationFactory.CreateClient(); + var response = await client.PostAsync("/api/v1.0/cron/CreateCronOnce", null); + Assert.True(response.IsSuccessStatusCode); + var stringResponse = await response.Content.ReadAsStringAsync(); + Assert.NotEmpty(stringResponse); + var cronClient = (IBackgroundJobClient?)this._applicationFactory.Services.GetService(typeof(IBackgroundJobClient)); + if (cronClient != null) { - var client = _applicationFactory.CreateClient(); - var response = await client.PostAsync("/api/v1.0/cron/CreateCronOnce", null); - Assert.True(response.IsSuccessStatusCode); - var stringResponse = await response.Content.ReadAsStringAsync(); - Assert.NotEmpty(stringResponse); - var cronClient = (IBackgroundJobClient?)this._applicationFactory.Services.GetService(typeof(IBackgroundJobClient)); - if (cronClient != null) - { - var deleted = cronClient.Delete(stringResponse); - Assert.True(deleted); - } + var deleted = cronClient.Delete(stringResponse); + Assert.True(deleted); } + } - [Fact] - public async Task SuccessCreateRecuranceTest() - { - var client = _applicationFactory.CreateClient(); - var response = await client.PostAsync("/api/v1.0/cron/CreateRecurance", null); - Assert.True(response.IsSuccessStatusCode); - var stringResponse = await response.Content.ReadAsStringAsync(); - Assert.NotEmpty(stringResponse); - _registeredRecurring.Add(stringResponse); - } + [Fact] + public async Task SuccessCreateRecuranceTest() + { + var client = _applicationFactory.CreateClient(); + var response = await client.PostAsync("/api/v1.0/cron/CreateRecurance", null); + Assert.True(response.IsSuccessStatusCode); + var stringResponse = await response.Content.ReadAsStringAsync(); + Assert.NotEmpty(stringResponse); + _registeredRecurring.Add(stringResponse); } } \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/ErrorControllerTest.cs b/BervProject.WebApi.Integration.Test/ErrorControllerTest.cs index 2783fa513..00314689f 100644 --- a/BervProject.WebApi.Integration.Test/ErrorControllerTest.cs +++ b/BervProject.WebApi.Integration.Test/ErrorControllerTest.cs @@ -1,30 +1,29 @@ -using BervProject.WebApi.Integration.Test.Fixtures; +namespace BervProject.WebApi.Integration.Test; + +using Fixtures; using Microsoft.AspNetCore.Mvc.Testing; using Newtonsoft.Json.Linq; -namespace BervProject.WebApi.Integration.Test +[Collection("Webapp")] +public class ErrorControllerTest { - [Collection("Webapp")] - public class ErrorControllerTest + private readonly WebApplicationFactory _applicationFactory; + public ErrorControllerTest(WebAppFixture webAppFixtures) + { + _applicationFactory = webAppFixtures.WebApp; + } + [Fact] + public async Task SuccessCheck() { - private readonly WebApplicationFactory _applicationFactory; - public ErrorControllerTest(WebAppFixture webAppFixtures) - { - this._applicationFactory = webAppFixtures.WebApp; - } - [Fact] - public async Task SuccessCheck() - { - var client = _applicationFactory.CreateClient(); - var response = await client.GetAsync("/api/v1.0/error/error"); - Assert.False(response.IsSuccessStatusCode); - Assert.Equal(System.Net.HttpStatusCode.InternalServerError, response.StatusCode); - var responseString = await response.Content.ReadAsStringAsync(); - var jObject = JObject.Parse(responseString); - var status = jObject.Value("status"); - var title = jObject.Value("title"); - Assert.Equal("An error occurred while processing your request.", title); - Assert.Equal(500, status); - } + var client = _applicationFactory.CreateClient(); + var response = await client.GetAsync("/api/v1.0/error/error"); + Assert.False(response.IsSuccessStatusCode); + Assert.Equal(System.Net.HttpStatusCode.InternalServerError, response.StatusCode); + var responseString = await response.Content.ReadAsStringAsync(); + var jObject = JObject.Parse(responseString); + var status = jObject.Value("status"); + var title = jObject.Value("title"); + Assert.Equal("An error occurred while processing your request.", title); + Assert.Equal(500, status); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/Fixtures/WebAppFixture.cs b/BervProject.WebApi.Integration.Test/Fixtures/WebAppFixture.cs index ac76367f1..2da3b04bb 100644 --- a/BervProject.WebApi.Integration.Test/Fixtures/WebAppFixture.cs +++ b/BervProject.WebApi.Integration.Test/Fixtures/WebAppFixture.cs @@ -1,21 +1,20 @@ -using Microsoft.AspNetCore.Mvc.Testing; +namespace BervProject.WebApi.Integration.Test.Fixtures; -namespace BervProject.WebApi.Integration.Test.Fixtures +using Microsoft.AspNetCore.Mvc.Testing; + +public class WebAppFixture : IDisposable { - public class WebAppFixture : IDisposable + public WebAppFixture() { - public WebAppFixture() - { - WebApp = new WebApplicationFactory() - .WithWebHostBuilder(builder => - { - // ... Configure test services - }); + WebApp = new WebApplicationFactory() + .WithWebHostBuilder(_ => + { + // ... Configure test services + }); - } + } - public void Dispose() => WebApp.Dispose(); + public void Dispose() => WebApp.Dispose(); - public WebApplicationFactory WebApp { get; private set; } - } -} + public WebApplicationFactory WebApp { get; } +} \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/HealthCheckTest.cs b/BervProject.WebApi.Integration.Test/HealthCheckTest.cs index 5eff2cc76..d96f5e767 100644 --- a/BervProject.WebApi.Integration.Test/HealthCheckTest.cs +++ b/BervProject.WebApi.Integration.Test/HealthCheckTest.cs @@ -1,24 +1,23 @@ -using BervProject.WebApi.Integration.Test.Fixtures; +namespace BervProject.WebApi.Integration.Test; + +using Fixtures; using Microsoft.AspNetCore.Mvc.Testing; -namespace BervProject.WebApi.Integration.Test +[Collection("Webapp")] +public class HealthCheckTest { - [Collection("Webapp")] - public class HealthCheckTest + private readonly WebApplicationFactory _applicationFactory; + public HealthCheckTest(WebAppFixture webAppFixtures) + { + _applicationFactory = webAppFixtures.WebApp; + } + [Fact] + public async Task SuccessCheck() { - private readonly WebApplicationFactory _applicationFactory; - public HealthCheckTest(WebAppFixture webAppFixtures) - { - this._applicationFactory = webAppFixtures.WebApp; - } - [Fact] - public async Task SuccessCheck() - { - var client = _applicationFactory.CreateClient(); - var response = await client.GetAsync("/health"); - Assert.True(response.IsSuccessStatusCode); - var stringResponse = await response.Content.ReadAsStringAsync(); - Assert.Equal("Healthy", stringResponse); - } + var client = _applicationFactory.CreateClient(); + var response = await client.GetAsync("/health"); + Assert.True(response.IsSuccessStatusCode); + var stringResponse = await response.Content.ReadAsStringAsync(); + Assert.Equal("Healthy", stringResponse); } } \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/NoteControllerTest.cs b/BervProject.WebApi.Integration.Test/NoteControllerTest.cs index a4bb3e9e8..626af8c01 100644 --- a/BervProject.WebApi.Integration.Test/NoteControllerTest.cs +++ b/BervProject.WebApi.Integration.Test/NoteControllerTest.cs @@ -1,47 +1,46 @@ +namespace BervProject.WebApi.Integration.Test; + using System.Net.Http.Json; -using BervProject.WebApi.Integration.Test.Fixtures; -using BervProject.WebApi.Boilerplate.Entities; +using Fixtures; +using Boilerplate.Entities; using Microsoft.AspNetCore.Mvc.Testing; -namespace BervProject.WebApi.Integration.Test +[Collection("Webapp")] +public class NoteControllerTest { - [Collection("Webapp")] - public class NoteControllerTest + private readonly WebApplicationFactory _applicationFactory; + public NoteControllerTest(WebAppFixture webAppFixtures) { - private readonly WebApplicationFactory _applicationFactory; - public NoteControllerTest(WebAppFixture webAppFixtures) - { - this._applicationFactory = webAppFixtures.WebApp; - } - [Fact] - public async Task CreateNoteTest() + _applicationFactory = webAppFixtures.WebApp; + } + [Fact] + public async Task CreateNoteTest() + { + var client = _applicationFactory.CreateClient(); + var response = await client.PostAsync("/api/v1.0/note/createTable", null); + Assert.True(response.IsSuccessStatusCode); + var stringResponse = await response.Content.ReadAsStringAsync(); + Assert.Equal("true", stringResponse); + var partitionKey = "part-1"; + var rowKey = "row-1"; + var title = "Hello World!"; + var message = "Yes!"; + var newNote = new Note() { - var client = _applicationFactory.CreateClient(); - var response = await client.PostAsync("/api/v1.0/note/createTable", null); - Assert.True(response.IsSuccessStatusCode); - var stringResponse = await response.Content.ReadAsStringAsync(); - Assert.Equal("true", stringResponse); - var partitionKey = "part-1"; - var rowKey = "row-1"; - var title = "Hello World!"; - var message = "Yes!"; - var newNote = new Note() - { - PartitionKey = partitionKey, - RowKey = rowKey, - Title = title, - Message = message, - }; - response = await client.PostAsJsonAsync("/api/v1.0/note/upsert", newNote); - Assert.True(response.IsSuccessStatusCode); - stringResponse = await response.Content.ReadAsStringAsync(); - Assert.Equal("true", stringResponse); - response = await client.GetAsync($"/api/v1.0/note/get?partitionKey={partitionKey}&rowKey={rowKey}"); - Assert.True(response.IsSuccessStatusCode); - var data = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(data); - Assert.Equal(title, data.Title); - Assert.Equal(message, data.Message); - } + PartitionKey = partitionKey, + RowKey = rowKey, + Title = title, + Message = message, + }; + response = await client.PostAsJsonAsync("/api/v1.0/note/upsert", newNote); + Assert.True(response.IsSuccessStatusCode); + stringResponse = await response.Content.ReadAsStringAsync(); + Assert.Equal("true", stringResponse); + response = await client.GetAsync($"/api/v1.0/note/get?partitionKey={partitionKey}&rowKey={rowKey}"); + Assert.True(response.IsSuccessStatusCode); + var data = await response.Content.ReadFromJsonAsync(); + Assert.NotNull(data); + Assert.Equal(title, data.Title); + Assert.Equal(message, data.Message); } } \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/StorageQueueControllerTest.cs b/BervProject.WebApi.Integration.Test/StorageQueueControllerTest.cs index ea1c4a4b0..f5f237422 100644 --- a/BervProject.WebApi.Integration.Test/StorageQueueControllerTest.cs +++ b/BervProject.WebApi.Integration.Test/StorageQueueControllerTest.cs @@ -1,42 +1,40 @@ +namespace BervProject.WebApi.Integration.Test; + using System.Net.Http.Json; using System.Text; using System.Text.Json; -using BervProject.WebApi.Boilerplate.Models; -using BervProject.WebApi.Boilerplate.Models.Response; -using BervProject.WebApi.Integration.Test.Fixtures; +using Boilerplate.Models; +using Boilerplate.Models.Response; +using Fixtures; using Microsoft.AspNetCore.Mvc.Testing; -using Newtonsoft.Json.Linq; -namespace BervProject.WebApi.Integration.Test +[Collection("Webapp")] +public class StorageQueueControllerTest { - [Collection("Webapp")] - public class StorageQueueControllerTest + private readonly WebApplicationFactory _applicationFactory; + public StorageQueueControllerTest(WebAppFixture webAppFixtures) + { + _applicationFactory = webAppFixtures.WebApp; + } + [Fact] + public async Task StorageQueueSendMessageTest() { - private readonly WebApplicationFactory _applicationFactory; - public StorageQueueControllerTest(WebAppFixture webAppFixtures) - { - this._applicationFactory = webAppFixtures.WebApp; - } - [Fact] - public async Task StorageQueueSendMessageTest() - { - var client = _applicationFactory.CreateClient(); - var messageData = new MessageData{ - Message = "Hello World!" - }; - using var content = new StringContent(JsonSerializer.Serialize(messageData), Encoding.UTF8, "application/json"); - var response = await client.PostAsync("/api/v1.0/storagequeue/sendMessage", content); - Assert.True(response.IsSuccessStatusCode); - var data = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(data); - Assert.True(data.IsSuccess); - response = await client.GetAsync("/api/v1.0/storagequeue/receiveMessage"); - Assert.True(response.IsSuccessStatusCode); - data = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(data); - Assert.True(data.IsSuccess); - Assert.Equal("Hello World!", data.YourMessage); + var client = _applicationFactory.CreateClient(); + var messageData = new MessageData{ + Message = "Hello World!" + }; + using var content = new StringContent(JsonSerializer.Serialize(messageData), Encoding.UTF8, "application/json"); + var response = await client.PostAsync("/api/v1.0/storagequeue/sendMessage", content); + Assert.True(response.IsSuccessStatusCode); + var data = await response.Content.ReadFromJsonAsync(); + Assert.NotNull(data); + Assert.True(data.IsSuccess); + response = await client.GetAsync("/api/v1.0/storagequeue/receiveMessage"); + Assert.True(response.IsSuccessStatusCode); + data = await response.Content.ReadFromJsonAsync(); + Assert.NotNull(data); + Assert.True(data.IsSuccess); + Assert.Equal("Hello World!", data.YourMessage); - } } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Integration.Test/WeatherForecastControllerTest.cs b/BervProject.WebApi.Integration.Test/WeatherForecastControllerTest.cs index 134cc035f..a1dc2f32a 100644 --- a/BervProject.WebApi.Integration.Test/WeatherForecastControllerTest.cs +++ b/BervProject.WebApi.Integration.Test/WeatherForecastControllerTest.cs @@ -1,28 +1,26 @@ - -using BervProject.WebApi.Boilerplate.Entities; -using BervProject.WebApi.Integration.Test.Fixtures; +namespace BervProject.WebApi.Integration.Test; + +using Boilerplate.Entities; +using Fixtures; using Microsoft.AspNetCore.Mvc.Testing; using System.Net.Http.Json; -namespace BervProject.WebApi.Integration.Test +[Collection("Webapp")] +public class WeatherForecastControllerTest { - [Collection("Webapp")] - public class WeatherForecastControllerTest + private readonly WebApplicationFactory _applicationFactory; + public WeatherForecastControllerTest(WebAppFixture webAppFixtures) + { + _applicationFactory = webAppFixtures.WebApp; + } + [Fact] + public async Task SuccessCheck() { - private readonly WebApplicationFactory _applicationFactory; - public WeatherForecastControllerTest(WebAppFixture webAppFixtures) - { - this._applicationFactory = webAppFixtures.WebApp; - } - [Fact] - public async Task SuccessCheck() - { - var client = _applicationFactory.CreateClient(); - var response = await client.GetAsync("/api/v1.0/weatherforecast/db"); - Assert.True(response.IsSuccessStatusCode); - var books = await response.Content.ReadFromJsonAsync>(); - Assert.NotNull(books); - Assert.Equal(2, books.Count); - } + var client = _applicationFactory.CreateClient(); + var response = await client.GetAsync("/api/v1.0/weatherforecast/db"); + Assert.True(response.IsSuccessStatusCode); + var books = await response.Content.ReadFromJsonAsync>(); + Assert.NotNull(books); + Assert.Equal(2, books.Count); } } \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/AWS/AWSS3ServiceTest.cs b/BervProject.WebApi.Test/Services/AWS/AWSS3ServiceTest.cs deleted file mode 100644 index 87d7d1c4a..000000000 --- a/BervProject.WebApi.Test/Services/AWS/AWSS3ServiceTest.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Amazon.S3; -using Amazon.S3.Model; -using Autofac.Extras.Moq; -using BervProject.WebApi.Boilerplate.Services.AWS; -using Microsoft.AspNetCore.Http; -using Moq; -using System.IO; -using System.Threading.Tasks; -using Xunit; - -namespace BervProject.WebApi.Test.Services.AWS -{ - public class AWSS3ServiceTest - { - - [Fact] - public async Task UploadFileSuccess() - { - using var mock = AutoMock.GetLoose(); - var amazonS3Mock = mock.Mock(); - var fileMock = mock.Mock(); - var nullStream = new MemoryStream(0); - var fileName = "ok.jpg"; - var contentType = "image/jpeg"; - amazonS3Mock.Setup(x => x.PutObjectAsync(It.IsAny(), default)); - fileMock.SetupGet(x => x.FileName).Returns(fileName); - fileMock.SetupGet(x => x.ContentType).Returns(contentType); - fileMock.Setup(x => x.OpenReadStream()).Returns(nullStream); - var awsS3Service = mock.Create(); - var result = await awsS3Service.UploadFile(fileMock.Object); - Assert.Equal($"uploads/{fileName}", result); - fileMock.Verify(x => x.OpenReadStream(), Times.Once()); - amazonS3Mock.Verify(x => x.PutObjectAsync(It.IsAny(), default), Times.Once()); - } - } -} diff --git a/BervProject.WebApi.Test/Services/AWS/AwsS3ServiceTest.cs b/BervProject.WebApi.Test/Services/AWS/AwsS3ServiceTest.cs new file mode 100644 index 000000000..8e20159dd --- /dev/null +++ b/BervProject.WebApi.Test/Services/AWS/AwsS3ServiceTest.cs @@ -0,0 +1,35 @@ +namespace BervProject.WebApi.Test.Services.AWS; + +using Amazon.S3; +using Amazon.S3.Model; +using Autofac.Extras.Moq; +using BervProject.WebApi.Boilerplate.Services.AWS; +using Microsoft.AspNetCore.Http; +using Moq; +using System.IO; +using System.Threading.Tasks; +using Xunit; + +public class AwsS3ServiceTest +{ + + [Fact] + public async Task UploadFileSuccess() + { + using var mock = AutoMock.GetLoose(); + var amazonS3Mock = mock.Mock(); + var fileMock = mock.Mock(); + var nullStream = new MemoryStream(0); + var fileName = "ok.jpg"; + var contentType = "image/jpeg"; + amazonS3Mock.Setup(x => x.PutObjectAsync(It.IsAny(), default)); + fileMock.SetupGet(x => x.FileName).Returns(fileName); + fileMock.SetupGet(x => x.ContentType).Returns(contentType); + fileMock.Setup(x => x.OpenReadStream()).Returns(nullStream); + var awsS3Service = mock.Create(); + var result = await awsS3Service.UploadFile(fileMock.Object); + Assert.Equal($"uploads/{fileName}", result); + fileMock.Verify(x => x.OpenReadStream(), Times.Once()); + amazonS3Mock.Verify(x => x.PutObjectAsync(It.IsAny(), default), Times.Once()); + } +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/AWS/DynamoDbServicesTest.cs b/BervProject.WebApi.Test/Services/AWS/DynamoDbServicesTest.cs index 24f6cb386..8da18de8d 100644 --- a/BervProject.WebApi.Test/Services/AWS/DynamoDbServicesTest.cs +++ b/BervProject.WebApi.Test/Services/AWS/DynamoDbServicesTest.cs @@ -1,4 +1,5 @@ -using System; +namespace BervProject.WebApi.Test.Services.AWS; + using System.Threading.Tasks; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; @@ -8,28 +9,25 @@ using Moq; using Xunit; -namespace BervProject.WebApi.Test.Services.AWS +public class DynamoDbServicesTest { - public class DynamoDbServicesTest + [Fact] + public async Task Test_CreateObject() { - [Fact] - public async Task Test_CreateObject() - { - using var mock = AutoMock.GetLoose(); - var amazonDynamoDBMock = mock.Mock(); - var logMock = mock.Mock>(); - amazonDynamoDBMock.Setup(x => x.PutItemAsync(It.IsAny(), default)) - .Returns(Task.FromResult(new PutItemResponse - { - HttpStatusCode = System.Net.HttpStatusCode.OK, - Attributes = new System.Collections.Generic.Dictionary + using var mock = AutoMock.GetLoose(); + var amazonDynamoDBMock = mock.Mock(); + var logMock = mock.Mock>(); + amazonDynamoDBMock.Setup(x => x.PutItemAsync(It.IsAny(), default)) + .Returns(Task.FromResult(new PutItemResponse + { + HttpStatusCode = System.Net.HttpStatusCode.OK, + Attributes = new System.Collections.Generic.Dictionary { - {"mock", new AttributeValue ("Hello")} + {"mock", new AttributeValue ("Hello")} } - })); - var dynamoDbServices = mock.Create(); - await dynamoDbServices.CreateObject(); - amazonDynamoDBMock.Verify(x => x.PutItemAsync(It.IsAny(), default), Times.Once()); - } + })); + var dynamoDbServices = mock.Create(); + await dynamoDbServices.CreateObject(); + amazonDynamoDBMock.Verify(x => x.PutItemAsync(It.IsAny(), default), Times.Once()); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/AWS/EmailServiceTest.cs b/BervProject.WebApi.Test/Services/AWS/EmailServiceTest.cs index 3db5161ee..6fcd07f04 100644 --- a/BervProject.WebApi.Test/Services/AWS/EmailServiceTest.cs +++ b/BervProject.WebApi.Test/Services/AWS/EmailServiceTest.cs @@ -1,4 +1,6 @@ -using Amazon.SimpleEmail; +namespace BervProject.WebApi.Test.Services.AWS; + +using Amazon.SimpleEmail; using Amazon.SimpleEmail.Model; using Autofac.Extras.Moq; using BervProject.WebApi.Boilerplate.Services.AWS; @@ -9,64 +11,61 @@ using System.Threading.Tasks; using Xunit; -namespace BervProject.WebApi.Test.Services.AWS +public class EmailServiceTest { - public class EmailServiceTest + [Fact] + public async Task SendEmailSuccess() { - [Fact] - public async Task SendEmailSuccess() + using var mock = AutoMock.GetLoose(); + var mockEmailService = mock.Mock(); + var logMock = mock.Mock>(); + var reciever = new List + { + "myreceiver@receiver.com" + }; + var sendEmailResponse = new SendEmailResponse() { - using var mock = AutoMock.GetLoose(); - var mockEmailService = mock.Mock(); - var logMock = mock.Mock>(); - var reciever = new List - { - "myreceiver@receiver.com" - }; - var sendEmailResponse = new SendEmailResponse() - { - HttpStatusCode = System.Net.HttpStatusCode.OK, - MessageId = "random", - ResponseMetadata = new Amazon.Runtime.ResponseMetadata() - }; - mockEmailService.Setup(x => x.SendEmailAsync(It.IsAny(), default)) - .Returns(Task.FromResult(sendEmailResponse)); - var emailService = mock.Create(); - await emailService.SendEmail(reciever); - mockEmailService.Verify(x => x.SendEmailAsync(It.IsAny(), default), Times.Once()); - } + HttpStatusCode = System.Net.HttpStatusCode.OK, + MessageId = "random", + ResponseMetadata = new Amazon.Runtime.ResponseMetadata() + }; + mockEmailService.Setup(x => x.SendEmailAsync(It.IsAny(), default)) + .Returns(Task.FromResult(sendEmailResponse)); + var emailService = mock.Create(); + await emailService.SendEmail(reciever); + mockEmailService.Verify(x => x.SendEmailAsync(It.IsAny(), default), Times.Once()); + } - [Fact] - public async Task SendEmailFailed() + [Fact] + public async Task SendEmailFailed() + { + using var mock = AutoMock.GetLoose(); + var mockEmailService = mock.Mock(); + var logMock = mock.Mock>(); + var reciever = new List + { + "myreceiver@receiver.com" + }; + var sendEmailResponse = new SendEmailResponse() { - using var mock = AutoMock.GetLoose(); - var mockEmailService = mock.Mock(); - var logMock = mock.Mock>(); - var reciever = new List - { - "myreceiver@receiver.com" - }; - var sendEmailResponse = new SendEmailResponse() - { - HttpStatusCode = System.Net.HttpStatusCode.InternalServerError, - MessageId = "random", - ResponseMetadata = new Amazon.Runtime.ResponseMetadata() - }; - mockEmailService.Setup(x => x.SendEmailAsync(It.IsAny(), default)) - .Returns(Task.FromResult(sendEmailResponse)); - var emailService = mock.Create(); - await emailService.SendEmail(reciever); - mockEmailService.Verify(x => x.SendEmailAsync(It.IsAny(), default), Times.Once()); - logMock.Verify(l => + HttpStatusCode = System.Net.HttpStatusCode.InternalServerError, + MessageId = "random", + ResponseMetadata = new Amazon.Runtime.ResponseMetadata() + }; + mockEmailService.Setup(x => x.SendEmailAsync(It.IsAny(), default)) + .Returns(Task.FromResult(sendEmailResponse)); + var emailService = mock.Create(); + await emailService.SendEmail(reciever); + mockEmailService.Verify(x => x.SendEmailAsync(It.IsAny(), default), Times.Once()); + logMock.Verify(l => l.Log( LogLevel.Warning, It.IsAny(), It.Is((state, type) => state.ToString().Equals("There is a problem when sending email")), null, (Func)It.IsAny() - ), - Times.Once() - ); - } + ), + Times.Once() + ); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/Azure/AzureQueueServicesTest.cs b/BervProject.WebApi.Test/Services/Azure/AzureQueueServicesTest.cs index a897cad6f..45e9bb9ba 100644 --- a/BervProject.WebApi.Test/Services/Azure/AzureQueueServicesTest.cs +++ b/BervProject.WebApi.Test/Services/Azure/AzureQueueServicesTest.cs @@ -1,63 +1,64 @@ -using Autofac; +using Azure.Messaging.ServiceBus; + +namespace BervProject.WebApi.Test.Services.Azure; + +using Autofac; using Autofac.Extras.Moq; -using Azure.Messaging.ServiceBus; -using BervProject.WebApi.Boilerplate.ConfigModel; +using Boilerplate.ConfigModel; using BervProject.WebApi.Boilerplate.Services.Azure; using Microsoft.Extensions.Logging; using Moq; using System.Threading.Tasks; using Xunit; -namespace BervProject.WebApi.Test.Services.Azure + +public class AzureQueueServiceTest { - public class AzureQueueServiceTest + [Fact] + public async Task SendHelloToQueueServiceBus() { - [Fact] - public async Task SendHelloToQueueServiceBus() + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + ServiceBus = new AzureServiceBus { - ServiceBus = new AzureServiceBus - { - QueueName = "" - } - }; - var message = "Hello!"; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var serviceBusClient = mock.Mock(); - var serviceBusSender = mock.Mock(); - serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); - serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Returns(Task.CompletedTask); - var queueService = mock.Create(); - var ok = await queueService.SendMessage("Hello!"); - serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); - serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); - Assert.True(ok); - } + QueueName = "" + } + }; + var message = "Hello!"; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var serviceBusClient = mock.Mock(); + var serviceBusSender = mock.Mock(); + serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); + serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Returns(Task.CompletedTask); + var queueService = mock.Create(); + var ok = await queueService.SendMessage("Hello!"); + serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); + serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); + Assert.True(ok); + } - [Fact] - public async Task SendMessageFailedTest() + [Fact] + public async Task SendMessageFailedTest() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + ServiceBus = new AzureServiceBus { - ServiceBus = new AzureServiceBus - { - QueueName = "" - } - }; - var message = "Hello!"; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var serviceBusClient = mock.Mock(); - var serviceBusSender = mock.Mock(); - serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); - serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Throws(); - var queueService = mock.Create(); - var ok = await queueService.SendMessage("Hello!"); - serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); - serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); - Assert.False(ok); - } + QueueName = "" + } + }; + var message = "Hello!"; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var serviceBusClient = mock.Mock(); + var serviceBusSender = mock.Mock(); + serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); + serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Throws(); + var queueService = mock.Create(); + var ok = await queueService.SendMessage("Hello!"); + serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); + serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); + Assert.False(ok); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/Azure/AzureStorageQueueServiceTest.cs b/BervProject.WebApi.Test/Services/Azure/AzureStorageQueueServiceTest.cs index c966d8d9a..7412ca224 100644 --- a/BervProject.WebApi.Test/Services/Azure/AzureStorageQueueServiceTest.cs +++ b/BervProject.WebApi.Test/Services/Azure/AzureStorageQueueServiceTest.cs @@ -1,188 +1,183 @@ -using Autofac; +using Azure.Storage.Queues; + +namespace BervProject.WebApi.Test.Services.Azure; + +using Autofac; using Autofac.Extras.Moq; -using Azure.Storage.Queues; -using Azure.Storage.Queues.Models; -using BervProject.WebApi.Boilerplate.ConfigModel; +using Boilerplate.ConfigModel; using BervProject.WebApi.Boilerplate.Services.Azure; using Microsoft.Extensions.Logging; using Moq; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Xunit; -namespace BervProject.WebApi.Test.Services.Azure +public class AzureStorageQueueServiceTest { - public class AzureStorageQueueServiceTest + [Fact] + public void ReceiveEmptyMessageTest() { - [Fact] - public void ReceiveEmptyMessageTest() + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Queue = new StorageQueue { - Queue = new StorageQueue - { - QueueName = "" - } + QueueName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var queueServiceClient = mock.Mock(); - var mockQueue = mock.Mock(); - queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); - mockQueue.Setup(x => x.CreateIfNotExists(null, default)); - mockQueue.Setup(x => x.Exists(default).Value).Returns(true); - mockQueue.Setup(x => x.ReceiveMessage(It.IsAny(), default).Value).Returns(() => null); - var queueService = mock.Create(); - var emptyResult = queueService.ReceiveMessage(); - mockQueue.Verify(x => x.Exists(default), Times.Once()); - mockQueue.Verify(x => x.ReceiveMessage(It.IsAny(), default), Times.Once()); - Assert.Null(emptyResult); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var queueServiceClient = mock.Mock(); + var mockQueue = mock.Mock(); + queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); + mockQueue.Setup(x => x.CreateIfNotExists(null, default)); + mockQueue.Setup(x => x.Exists(default).Value).Returns(true); + mockQueue.Setup(x => x.ReceiveMessage(It.IsAny(), default).Value).Returns(() => null); + var queueService = mock.Create(); + var emptyResult = queueService.ReceiveMessage(); + mockQueue.Verify(x => x.Exists(default), Times.Once()); + mockQueue.Verify(x => x.ReceiveMessage(It.IsAny(), default), Times.Once()); + Assert.Null(emptyResult); + } - [Fact] - public void ReceiveEmptyMessageBecauseQueueNotFoundTest() + [Fact] + public void ReceiveEmptyMessageBecauseQueueNotFoundTest() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Queue = new StorageQueue { - Queue = new StorageQueue - { - QueueName = "" - } + QueueName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var queueServiceClient = mock.Mock(); - var mockQueue = mock.Mock(); - queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); - mockQueue.Setup(x => x.CreateIfNotExists(null, default)); - mockQueue.Setup(x => x.Exists(default).Value).Returns(false); - mockQueue.Setup(x => x.ReceiveMessage(It.IsAny(), default).Value).Returns(() => null); - var queueService = mock.Create(); - var emptyResult = queueService.ReceiveMessage(); - mockQueue.Verify(x => x.Exists(default), Times.Once()); - mockQueue.Verify(x => x.ReceiveMessage(It.IsAny(), default), Times.Never()); - Assert.Null(emptyResult); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var queueServiceClient = mock.Mock(); + var mockQueue = mock.Mock(); + queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); + mockQueue.Setup(x => x.CreateIfNotExists(null, default)); + mockQueue.Setup(x => x.Exists(default).Value).Returns(false); + mockQueue.Setup(x => x.ReceiveMessage(It.IsAny(), default).Value).Returns(() => null); + var queueService = mock.Create(); + var emptyResult = queueService.ReceiveMessage(); + mockQueue.Verify(x => x.Exists(default), Times.Once()); + mockQueue.Verify(x => x.ReceiveMessage(It.IsAny(), default), Times.Never()); + Assert.Null(emptyResult); + } - [Fact] - public void ReceiveEmptyMessageBecauseExceptionTest() + [Fact] + public void ReceiveEmptyMessageBecauseExceptionTest() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Queue = new StorageQueue { - Queue = new StorageQueue - { - QueueName = "" - } + QueueName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var queueServiceClient = mock.Mock(); - var mockQueue = mock.Mock(); - queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); - mockQueue.Setup(x => x.CreateIfNotExists(null, default)); - mockQueue.Setup(x => x.Exists(default).Value).Returns(false); - mockQueue.Setup(x => x.ReceiveMessage(It.IsAny(), default).Value).Throws(); - var queueService = mock.Create(); - var emptyResult = queueService.ReceiveMessage(); - mockQueue.Verify(x => x.Exists(default), Times.Once()); - mockQueue.Verify(x => x.ReceiveMessage(It.IsAny(), default), Times.Never()); - Assert.Null(emptyResult); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var queueServiceClient = mock.Mock(); + var mockQueue = mock.Mock(); + queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); + mockQueue.Setup(x => x.CreateIfNotExists(null, default)); + mockQueue.Setup(x => x.Exists(default).Value).Returns(false); + mockQueue.Setup(x => x.ReceiveMessage(It.IsAny(), default).Value).Throws(); + var queueService = mock.Create(); + var emptyResult = queueService.ReceiveMessage(); + mockQueue.Verify(x => x.Exists(default), Times.Once()); + mockQueue.Verify(x => x.ReceiveMessage(It.IsAny(), default), Times.Never()); + Assert.Null(emptyResult); + } - [Fact] - public void SendMessageSuccessTest() + [Fact] + public void SendMessageSuccessTest() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Queue = new StorageQueue { - Queue = new StorageQueue - { - QueueName = "" - } + QueueName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var queueServiceClient = mock.Mock(); - var mockQueue = mock.Mock(); - queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); - mockQueue.Setup(x => x.CreateIfNotExists(null, default)); - mockQueue.Setup(x => x.Exists(default).Value).Returns(true); - var message = "boba"; - mockQueue.Setup(x => x.SendMessage(It.IsAny(), default)).Returns(() => null); - var queueService = mock.Create(); - var success = queueService.SendMessage(message); - mockQueue.Verify(x => x.Exists(default), Times.Once()); - Assert.True(success); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var queueServiceClient = mock.Mock(); + var mockQueue = mock.Mock(); + queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); + mockQueue.Setup(x => x.CreateIfNotExists(null, default)); + mockQueue.Setup(x => x.Exists(default).Value).Returns(true); + var message = "boba"; + mockQueue.Setup(x => x.SendMessage(It.IsAny(), default)).Returns(() => null); + var queueService = mock.Create(); + var success = queueService.SendMessage(message); + mockQueue.Verify(x => x.Exists(default), Times.Once()); + Assert.True(success); + } - [Fact] - public void SendMessageFailedTest() + [Fact] + public void SendMessageFailedTest() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Queue = new StorageQueue { - Queue = new StorageQueue - { - QueueName = "" - } + QueueName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var queueServiceClient = mock.Mock(); - var mockQueue = mock.Mock(); - queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); - mockQueue.Setup(x => x.CreateIfNotExists(null, default)); - mockQueue.Setup(x => x.Exists(default).Value).Returns(false); - var message = "boba"; - mockQueue.Setup(x => x.SendMessage(It.IsAny(), default)).Returns(() => null); - var queueService = mock.Create(); - var success = queueService.SendMessage(message); - mockQueue.Verify(x => x.Exists(default), Times.Once()); - Assert.False(success); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var queueServiceClient = mock.Mock(); + var mockQueue = mock.Mock(); + queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); + mockQueue.Setup(x => x.CreateIfNotExists(null, default)); + mockQueue.Setup(x => x.Exists(default).Value).Returns(false); + var message = "boba"; + mockQueue.Setup(x => x.SendMessage(It.IsAny(), default)).Returns(() => null); + var queueService = mock.Create(); + var success = queueService.SendMessage(message); + mockQueue.Verify(x => x.Exists(default), Times.Once()); + Assert.False(success); + } - [Fact] - public void SendMessageFailedBecauseExceptionTest() + [Fact] + public void SendMessageFailedBecauseExceptionTest() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Queue = new StorageQueue { - Queue = new StorageQueue - { - QueueName = "" - } + QueueName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var queueServiceClient = mock.Mock(); - var mockQueue = mock.Mock(); - queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); - mockQueue.Setup(x => x.CreateIfNotExists(null, default)); - mockQueue.Setup(x => x.Exists(default).Value).Returns(false); - var message = "boba"; - mockQueue.Setup(x => x.SendMessage(It.IsAny(), default)).Throws(); - var queueService = mock.Create(); - var success = queueService.SendMessage(message); - mockQueue.Verify(x => x.Exists(default), Times.Once()); - Assert.False(success); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var queueServiceClient = mock.Mock(); + var mockQueue = mock.Mock(); + queueServiceClient.Setup(x => x.GetQueueClient("")).Returns(mockQueue.Object); + mockQueue.Setup(x => x.CreateIfNotExists(null, default)); + mockQueue.Setup(x => x.Exists(default).Value).Returns(false); + var message = "boba"; + mockQueue.Setup(x => x.SendMessage(It.IsAny(), default)).Throws(); + var queueService = mock.Create(); + var success = queueService.SendMessage(message); + mockQueue.Verify(x => x.Exists(default), Times.Once()); + Assert.False(success); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/Azure/BlobServiceTest.cs b/BervProject.WebApi.Test/Services/Azure/BlobServiceTest.cs index 05f2ca34c..3d4100147 100644 --- a/BervProject.WebApi.Test/Services/Azure/BlobServiceTest.cs +++ b/BervProject.WebApi.Test/Services/Azure/BlobServiceTest.cs @@ -1,8 +1,11 @@ -using Autofac; -using Autofac.Extras.Moq; -using Azure.Storage.Blobs; +using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; -using BervProject.WebApi.Boilerplate.ConfigModel; + +namespace BervProject.WebApi.Test.Services.Azure; + +using Autofac; +using Autofac.Extras.Moq; +using Boilerplate.ConfigModel; using BervProject.WebApi.Boilerplate.Services.Azure; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; @@ -10,119 +13,116 @@ using System.IO; using Xunit; -namespace BervProject.WebApi.Test.Services.Azure +public class BlobServiceTest { - public class BlobServiceTest + [Fact] + public void CreateStorageTest() { - [Fact] - public void CreateStorageTest() + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Blob = new BlobStorage { - Blob = new BlobStorage - { - ContainerName = "" - } + ContainerName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var blobServiceClient = mock.Mock(); - var mockContainer = mock.Mock(); - blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); - var blobService = mock.Create(); - blobService.CreateStorageContainer(); - mockContainer.Verify(x => x.CreateIfNotExists(PublicAccessType.None, null, null, default), Times.Once()); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var blobServiceClient = mock.Mock(); + var mockContainer = mock.Mock(); + blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); + var blobService = mock.Create(); + blobService.CreateStorageContainer(); + mockContainer.Verify(x => x.CreateIfNotExists(PublicAccessType.None, null, null, default), Times.Once()); + } - [Fact] - public void GettingEmptyBlobWhenContainerNotExists() + [Fact] + public void GettingEmptyBlobWhenContainerNotExists() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Blob = new BlobStorage { - Blob = new BlobStorage - { - ContainerName = "" - } + ContainerName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var blobServiceClient = mock.Mock(); - var mockContainer = mock.Mock(); - blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); - mockContainer.Setup(x => x.Exists(default).Value).Returns(false); - var blobService = mock.Create(); - var listResult = blobService.GetBlobsInfo(); - mockContainer.Verify(x => x.Exists(default), Times.Once()); - Assert.Empty(listResult); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var blobServiceClient = mock.Mock(); + var mockContainer = mock.Mock(); + blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); + mockContainer.Setup(x => x.Exists(default).Value).Returns(false); + var blobService = mock.Create(); + var listResult = blobService.GetBlobsInfo(); + mockContainer.Verify(x => x.Exists(default), Times.Once()); + Assert.Empty(listResult); + } - [Fact] - public void UploadFileWhenContainerExist() + [Fact] + public void UploadFileWhenContainerExist() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Blob = new BlobStorage { - Blob = new BlobStorage - { - ContainerName = "" - } + ContainerName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var blobServiceClient = mock.Mock(); - var mockContainer = mock.Mock(); - var mockBlobClient = mock.Mock(); - var fileMock = mock.Mock(); - var nullStream = new MemoryStream(0); - blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); - mockContainer.Setup(x => x.Exists(default).Value).Returns(true); - var fileName = "Dummy"; - mockContainer.Setup(x => x.GetBlobClient(fileName)).Returns(mockBlobClient.Object); - fileMock.SetupGet(x => x.FileName).Returns(fileName); - fileMock.Setup(x => x.OpenReadStream()).Returns(nullStream); - var blobService = mock.Create(); - blobService.UploadFile(fileMock.Object); - fileMock.Verify(x => x.OpenReadStream(), Times.Once()); - mockContainer.Verify(x => x.GetBlobClient(fileName), Times.Once()); - mockBlobClient.Verify(x => x.Upload(It.IsAny(), true, default), Times.Once()); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var blobServiceClient = mock.Mock(); + var mockContainer = mock.Mock(); + var mockBlobClient = mock.Mock(); + var fileMock = mock.Mock(); + var nullStream = new MemoryStream(0); + blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); + mockContainer.Setup(x => x.Exists(default).Value).Returns(true); + var fileName = "Dummy"; + mockContainer.Setup(x => x.GetBlobClient(fileName)).Returns(mockBlobClient.Object); + fileMock.SetupGet(x => x.FileName).Returns(fileName); + fileMock.Setup(x => x.OpenReadStream()).Returns(nullStream); + var blobService = mock.Create(); + blobService.UploadFile(fileMock.Object); + fileMock.Verify(x => x.OpenReadStream(), Times.Once()); + mockContainer.Verify(x => x.GetBlobClient(fileName), Times.Once()); + mockBlobClient.Verify(x => x.Upload(It.IsAny(), true, default), Times.Once()); + } - [Fact] - public void UploadFileWhenContainerNotExist() + [Fact] + public void UploadFileWhenContainerNotExist() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + Storage = new AzureStorage { - Storage = new AzureStorage + Blob = new BlobStorage { - Blob = new BlobStorage - { - ContainerName = "" - } + ContainerName = "" } - }; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var blobServiceClient = mock.Mock(); - var mockContainer = mock.Mock(); - var fileMock = mock.Mock(); - var nullStream = new MemoryStream(0); - blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); - mockContainer.Setup(x => x.Exists(default).Value).Returns(false); - var fileName = "Dummy"; - fileMock.SetupGet(x => x.FileName).Returns(fileName); - fileMock.Setup(x => x.OpenReadStream()).Returns(nullStream); - var blobService = mock.Create(); - blobService.UploadFile(fileMock.Object); - fileMock.Verify(x => x.OpenReadStream(), Times.Never()); - mockContainer.Verify(x => x.UploadBlob(fileName, nullStream, default), Times.Never()); - } + } + }; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var blobServiceClient = mock.Mock(); + var mockContainer = mock.Mock(); + var fileMock = mock.Mock(); + var nullStream = new MemoryStream(0); + blobServiceClient.Setup(x => x.GetBlobContainerClient("")).Returns(mockContainer.Object); + mockContainer.Setup(x => x.Exists(default).Value).Returns(false); + var fileName = "Dummy"; + fileMock.SetupGet(x => x.FileName).Returns(fileName); + fileMock.Setup(x => x.OpenReadStream()).Returns(nullStream); + var blobService = mock.Create(); + blobService.UploadFile(fileMock.Object); + fileMock.Verify(x => x.OpenReadStream(), Times.Never()); + mockContainer.Verify(x => x.UploadBlob(fileName, nullStream, default), Times.Never()); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/Azure/TopicServiceTest.cs b/BervProject.WebApi.Test/Services/Azure/TopicServiceTest.cs index 32e5113d2..fb836901b 100644 --- a/BervProject.WebApi.Test/Services/Azure/TopicServiceTest.cs +++ b/BervProject.WebApi.Test/Services/Azure/TopicServiceTest.cs @@ -1,69 +1,63 @@ -using Autofac; +using Azure.Messaging.ServiceBus; + +namespace BervProject.WebApi.Test.Services.Azure; + +using Autofac; using Autofac.Extras.Moq; -using Azure.Messaging.ServiceBus; -using Azure.Storage.Queues; -using Azure.Storage.Queues.Models; -using BervProject.WebApi.Boilerplate.ConfigModel; +using Boilerplate.ConfigModel; using BervProject.WebApi.Boilerplate.Services.Azure; using Microsoft.Extensions.Logging; using Moq; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Xunit; -namespace BervProject.WebApi.Test.Services.Azure +public class TopicServiceTest { - public class TopicServiceTest + [Fact] + public async Task SendHelloToTopicServiceBus() { - [Fact] - public async Task SendHelloToTopicServiceBus() + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + ServiceBus = new AzureServiceBus { - ServiceBus = new AzureServiceBus - { - TopicName = "" - } - }; - var message = "Hello!"; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var serviceBusClient = mock.Mock(); - var serviceBusSender = mock.Mock(); - serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); - serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Returns(Task.CompletedTask); - var queueService = mock.Create(); - var ok = await queueService.SendTopic("Hello!"); - serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); - serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); - Assert.True(ok); - } + TopicName = "" + } + }; + var message = "Hello!"; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var serviceBusClient = mock.Mock(); + var serviceBusSender = mock.Mock(); + serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); + serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Returns(Task.CompletedTask); + var queueService = mock.Create(); + var ok = await queueService.SendTopic("Hello!"); + serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); + serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); + Assert.True(ok); + } - [Fact] - public async Task SendMessageFailedTest() + [Fact] + public async Task SendMessageFailedTest() + { + var azureConfig = new AzureConfiguration { - var azureConfig = new AzureConfiguration + ServiceBus = new AzureServiceBus { - ServiceBus = new AzureServiceBus - { - TopicName = "" - } - }; - var message = "Hello!"; - using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); - var loggerMock = mock.Mock>(); - var serviceBusClient = mock.Mock(); - var serviceBusSender = mock.Mock(); - serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); - serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Throws(); - var queueService = mock.Create(); - var ok = await queueService.SendTopic("Hello!"); - serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); - serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); - Assert.False(ok); - } + TopicName = "" + } + }; + var message = "Hello!"; + using var mock = AutoMock.GetLoose(cfg => cfg.RegisterInstance(azureConfig).As()); + var loggerMock = mock.Mock>(); + var serviceBusClient = mock.Mock(); + var serviceBusSender = mock.Mock(); + serviceBusClient.Setup(x => x.CreateSender("")).Returns(serviceBusSender.Object); + serviceBusSender.Setup(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default)).Throws(); + var queueService = mock.Create(); + var ok = await queueService.SendTopic("Hello!"); + serviceBusSender.Verify(x => x.SendMessageAsync(It.Is(x => x.Body.ToString() == message), default), Times.Once()); + serviceBusSender.Verify(x => x.CloseAsync(default), Times.Once); + Assert.False(ok); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/CronServiceTest.cs b/BervProject.WebApi.Test/Services/CronServiceTest.cs index 6fb0d06f5..0869db115 100644 --- a/BervProject.WebApi.Test/Services/CronServiceTest.cs +++ b/BervProject.WebApi.Test/Services/CronServiceTest.cs @@ -1,45 +1,44 @@ -using Autofac.Extras.Moq; +namespace BervProject.WebApi.Test.Services; + +using Autofac.Extras.Moq; using BervProject.WebApi.Boilerplate.Services; using Microsoft.Extensions.Logging; using Moq; using System; using Xunit; -namespace BervProject.WebApi.Test.Services +public class CronServiceTest { - public class CronServiceTest - { - [Fact] - public void ProcessDataSuccess() - { - using var mock = AutoMock.GetLoose(); - var loggerMock = mock.Mock>(); - var loggerFactoryMock = mock.Mock(); - loggerFactoryMock.Setup(x => x.CreateLogger(It.IsAny())).Returns(loggerMock.Object); - var processData = mock.Create(); - processData.HelloWorld(); - loggerMock.Verify(logger => logger.Log( - It.Is(logLevel => logLevel == LogLevel.Debug), - It.Is(eventId => eventId.Id == 0), - It.Is((@object, @type) => @object.ToString() == "Run Cron" && @type.Name == "FormattedLogValues"), - It.IsAny(), - It.IsAny>()), - Times.Once); - loggerMock.Verify(logger => logger.Log( - It.Is(logLevel => logLevel == LogLevel.Information), - It.Is(eventId => eventId.Id == 0), - It.Is((@object, @type) => @object.ToString() == "Hello World Cron!" && @type.Name == "FormattedLogValues"), - It.IsAny(), - It.IsAny>()), - Times.Once); - loggerMock.Verify(logger => logger.Log( - It.Is(logLevel => logLevel == LogLevel.Debug), - It.Is(eventId => eventId.Id == 0), - It.Is((@object, @type) => @object.ToString() == "Finished Run Cron" && @type.Name == "FormattedLogValues"), - It.IsAny(), - It.IsAny>()), - Times.Once); - } + [Fact] + public void ProcessDataSuccess() + { + using var mock = AutoMock.GetLoose(); + var loggerMock = mock.Mock>(); + var loggerFactoryMock = mock.Mock(); + loggerFactoryMock.Setup(x => x.CreateLogger(It.IsAny())).Returns(loggerMock.Object); + var processData = mock.Create(); + processData.HelloWorld(); + loggerMock.Verify(logger => logger.Log( + It.Is(logLevel => logLevel == LogLevel.Debug), + It.Is(eventId => eventId.Id == 0), + It.Is((@object, @type) => @object.ToString() == "Run Cron" && @type.Name == "FormattedLogValues"), + It.IsAny(), + It.IsAny>()), + Times.Once); + loggerMock.Verify(logger => logger.Log( + It.Is(logLevel => logLevel == LogLevel.Information), + It.Is(eventId => eventId.Id == 0), + It.Is((@object, @type) => @object.ToString() == "Hello World Cron!" && @type.Name == "FormattedLogValues"), + It.IsAny(), + It.IsAny>()), + Times.Once); + loggerMock.Verify(logger => logger.Log( + It.Is(logLevel => logLevel == LogLevel.Debug), + It.Is(eventId => eventId.Id == 0), + It.Is((@object, @type) => @object.ToString() == "Finished Run Cron" && @type.Name == "FormattedLogValues"), + It.IsAny(), + It.IsAny>()), + Times.Once); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/Services/ProcessDataTest.cs b/BervProject.WebApi.Test/Services/ProcessDataTest.cs index 0e20caa4c..8bf1639f5 100644 --- a/BervProject.WebApi.Test/Services/ProcessDataTest.cs +++ b/BervProject.WebApi.Test/Services/ProcessDataTest.cs @@ -1,29 +1,28 @@ -using Autofac.Extras.Moq; +namespace BervProject.WebApi.Test.Services; + +using Autofac.Extras.Moq; using BervProject.WebApi.Boilerplate.Services; using Microsoft.Extensions.Logging; using Moq; using System; using Xunit; -namespace BervProject.WebApi.Test.Services +public class ProcessDataTest { - public class ProcessDataTest - { - [Fact] - public void ProcessDataSuccess() - { - using var mock = AutoMock.GetLoose(); - var loggerMock = mock.Mock>(); - var processData = mock.Create(); - processData.Process("Hello!"); - loggerMock.Verify(logger => logger.Log( - It.Is(logLevel => logLevel == LogLevel.Debug), - It.Is(eventId => eventId.Id == 0), - It.Is((@object, @type) => @object.ToString() == "You get message: Hello!" && @type.Name == "FormattedLogValues"), - It.IsAny(), - It.IsAny>()), - Times.Once); - } + [Fact] + public void ProcessDataSuccess() + { + using var mock = AutoMock.GetLoose(); + var loggerMock = mock.Mock>(); + var processData = mock.Create(); + processData.Process("Hello!"); + loggerMock.Verify(logger => logger.Log( + It.Is(logLevel => logLevel == LogLevel.Debug), + It.Is(eventId => eventId.Id == 0), + It.Is((@object, @type) => @object.ToString() == "You get message: Hello!" && @type.Name == "FormattedLogValues"), + It.IsAny(), + It.IsAny>()), + Times.Once); } -} +} \ No newline at end of file diff --git a/BervProject.WebApi.Test/WeatherForecastTest.cs b/BervProject.WebApi.Test/WeatherForecastTest.cs index 6a9c49973..39448dede 100644 --- a/BervProject.WebApi.Test/WeatherForecastTest.cs +++ b/BervProject.WebApi.Test/WeatherForecastTest.cs @@ -1,5 +1,7 @@ +namespace BervProject.WebApi.Test; + using Autofac.Extras.Moq; -using BervProject.WebApi.Boilerplate.Controllers; +using Boilerplate.Controllers; using Microsoft.Extensions.Caching.Distributed; using Moq; using System; @@ -7,50 +9,47 @@ using System.Text; using Xunit; -namespace BervProject.WebApi.Test +public class WeatherForecastTest { - public class WeatherForecastTest + [Fact] + public void GetTest() { - [Fact] - public void GetTest() - { - using var mock = AutoMock.GetLoose(); - var controller = mock.Create(); - var result = controller.Get(); - Assert.Equal(5, result.Count()); - } + using var mock = AutoMock.GetLoose(); + var controller = mock.Create(); + var result = controller.Get(); + Assert.Equal(5, result.Count()); + } - [Fact] - public void GetCacheTest() - { - using var mock = AutoMock.GetLoose(); - mock.Mock().Setup(x => x.Get(It.IsAny())).Returns((byte[])null); - var cacheMock = mock.Create(); - var controller = mock.Create(); - var result = controller.GetCache(cacheMock); - Assert.Equal("", result.Value); - } + [Fact] + public void GetCacheTest() + { + using var mock = AutoMock.GetLoose(); + mock.Mock().Setup(x => x.Get(It.IsAny())).Returns((byte[])null); + var cacheMock = mock.Create(); + var controller = mock.Create(); + var result = controller.GetCache(cacheMock); + Assert.Equal("", result.Value); + } - [Fact] - public void GetCacheResultTest() - { - using var mock = AutoMock.GetLoose(); - const string expectedResult = "I know anything"; - var expectedByte = Encoding.ASCII.GetBytes(expectedResult); - mock.Mock().Setup(x => x.Get(It.IsAny())).Returns(expectedByte); - var cacheMock = mock.Create(); - var controller = mock.Create(); - var result = controller.GetCache(cacheMock); - Assert.Equal(expectedResult, result.Value); - } + [Fact] + public void GetCacheResultTest() + { + using var mock = AutoMock.GetLoose(); + const string expectedResult = "I know anything"; + var expectedByte = Encoding.ASCII.GetBytes(expectedResult); + mock.Mock().Setup(x => x.Get(It.IsAny())).Returns(expectedByte); + var cacheMock = mock.Create(); + var controller = mock.Create(); + var result = controller.GetCache(cacheMock); + Assert.Equal(expectedResult, result.Value); + } - [Fact] - public void TriggerExceptionTest() - { - using var mock = AutoMock.GetLoose(); - var controller = mock.Create(); - var result = Assert.Throws(() => controller.TriggerException()); - Assert.Equal("Unhandled Exception", result.Message); - } + [Fact] + public void TriggerExceptionTest() + { + using var mock = AutoMock.GetLoose(); + var controller = mock.Create(); + var result = Assert.Throws(() => controller.TriggerException()); + Assert.Equal("Unhandled Exception", result.Message); } -} +} \ No newline at end of file diff --git a/README.md b/README.md index e4043ea72..9f61c098e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Net Core Web API Boilerplate for My Project ## .NET Version -8.0 +> 9.0 ## Build Status diff --git a/azure-pipelines.yml b/azure-pipelines.yml index db5403293..c32b0085f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,7 +14,7 @@ pool: resources: containers: - container: postgres - image: postgres:17-alpine + image: postgres:18-alpine env: POSTGRES_PASSWORD: postgres POSTGRES_DB: testdb