Skip to content

Commit

Permalink
Feature/f06 (#9)
Browse files Browse the repository at this point in the history
* Реализация чтения информации о группе, добавлены авто тесты

В Readme.md написал как получить Api ключ и как добавить его в код ;
написал названия для тестов, отражая их назначение ;
Response для постов, и для информации о группе, разбил на 1 файл = 1 класс ;
ошибки о доступах к группе или постам со стены паблика, теперь выводятся не в консоль, а как исключение;
написал комменты к методам, описывающие, что делает метод.

Изменена сигнатура методов GetPostsAsync и GetGroupInfoAsync, написан класс VkApiException, написаны тесты для выброса ошибок

1. метод GetGroupInfoAsync теперь дополнительно запрашивает id группы, запрос также формируется теперь в методе
2. метод GetPostsAsync теперь дополнительно запрашивает id группы и количество выводимых постов
3. VkApiException наследуется от Exception и дополнительно реализует код ошибки
4. написаны 2 теста на проверку выбрасывания ошибок в методах GetGroupInfoAsync и GetPostsAsync
  • Loading branch information
Krylovchan authored Dec 13, 2023
1 parent dd1ecad commit 3d14a72
Show file tree
Hide file tree
Showing 42 changed files with 1,087 additions and 3 deletions.
1 change: 1 addition & 0 deletions TaktTusur.Media.Clients.VkApi.Tests/GlobalUsings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
global using NUnit.Framework;
16 changes: 16 additions & 0 deletions TaktTusur.Media.Clients.VkApi.Tests/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Для получения API ключа ВКонтакте необходимо:
1. Зарегистрироваться как разработчик на сайте https://vk.com/dev.
2. Выбрать Standalone - приложение (далее вам предложат перейти в другой сервис)
3. В нем выбрать физическое лицо
4. Ввести название приложеия, выбрать Web
5. Ввести домены (как пример testapp.ru)
6. Зайти в приложениеи найти раздел "Ключи доступа"
7. Нужно нажать на знак глаза для "Сервисного ключа доступа" - это и есть наш API ключ

Для того чтобы добавить его в код необходимо:
1. ПКМ щелкнуть по проекту с тестами (TaktTusur.Media.Clients.VkApi.Tests)
2. Выбрать пункт "Управление секретами пользователей
3. и между фигурных скобок вставить ("VkApiKey": " ***Ваш API ключ*** ")
4. Сохранить файл

Программа готова к работе
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<UserSecretsId>TaktTusur.Media.Clients.VkApi.Tests-35b2d6fa-2999-47f6-b581-f3806fb37ba6</UserSecretsId>
</PropertyGroup>

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.1" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\TaktTusur.Media.Clients.VkApi\TaktTusur.Media.Clients.VkApi.csproj" />
</ItemGroup>

</Project>
65 changes: 65 additions & 0 deletions TaktTusur.Media.Clients.VkApi.Tests/VkApiClientTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using Microsoft.Extensions.Configuration;

namespace TaktTusur.Media.Clients.VkApi.Tests;

public class VkApiClientTests
{
private VkApiOptions _options = new VkApiOptions();

public VkApiClientTests()
{
var builder = new ConfigurationBuilder()
.AddUserSecrets<VkApiClientTests>();

var config = builder.Build();
_options.Key = config["VkApiKey"];
}
[SetUp]
public void Setup()
{
}

[Test]
public async Task CheckingTitleVkGroup()
{
var clientApi = new VkApiClient(_options);
var info = await clientApi.GetGroupInfoAsync("takt_tusur", CancellationToken.None);
Assert.AreEqual("Туристско-Альпинистский клуб ТУСУРа (ТАКТ)", info.GroupName, "неправильное название группы");
}

[Test]
public async Task CheckingQuantityOfPostsFromVkGroupWall ()
{
var clientApi = new VkApiClient(_options);
var testResult = await clientApi.GetPostsAsync("takt_tusur", 5, CancellationToken.None);
Assert.AreEqual(2406, testResult.Count, "неправильное количестов постов");
}

[Test]
public async Task CheckingPhotoIdFromAttachmentsFromVkGroupWallPost()
{
var clientApi = new VkApiClient(_options);
var testResult = await clientApi.GetPostsAsync("takt_tusur", 5, CancellationToken.None);
Assert.AreEqual(457265786, testResult.Posts[1].PostAttachment[0].Photo.Id, "неправильный ID");
}

[Test]
public async Task CheckingThrowingExceptionGetGroupInfo()
{
var clientApi = new VkApiClient(_options);
Assert.ThrowsAsync<VkApiException>(async () =>
{
var info = await clientApi.GetGroupInfoAsync("takttusur", CancellationToken.None);
});
}

[Test]
public async Task CheckingThrowingExceptionGetPost()
{
var clientApi = new VkApiClient(_options);
Assert.ThrowsAsync<VkApiException>(async () =>
{
var testResult = await clientApi.GetPostsAsync("takttusur", 5, CancellationToken.None);
});
}
}
15 changes: 15 additions & 0 deletions TaktTusur.Media.Clients.VkApi/GroupByIdRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using RestSharp;

namespace TaktTusur.Media.Clients.VkApi;

public class GroupByIdRequest
{
[RequestProperty (Name = "group_id")]
public string GroupId { get; set; }

[RequestProperty(Name = "access_token")]
public string AccessToken { get; set; }

[RequestProperty(Name = "v")]
public string Version { get; set; }
}
13 changes: 13 additions & 0 deletions TaktTusur.Media.Clients.VkApi/GroupInfoResponse/Error.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Text.Json.Serialization;

namespace TaktTusur.Media.Clients.VkApi.GroupInfoResponse
{
public class Error
{
[JsonPropertyName("error_code")]
public int ErrorCode { get; set; }

[JsonPropertyName("error_msg")]
public string ErrorMessage { get; set; }
}
}
31 changes: 31 additions & 0 deletions TaktTusur.Media.Clients.VkApi/GroupInfoResponse/Group.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System.Text.Json.Serialization;

namespace TaktTusur.Media.Clients.VkApi.GroupInfoResponse
{
public class Group
{
[JsonPropertyName("id")]
public int Id { get; set; }

[JsonPropertyName("name")]
public string Name { get; set; }

[JsonPropertyName("screen_name")]
public string ScreenName { get; set; }

[JsonPropertyName("Is_closed")]
public int IsClosed { get; set; }

[JsonPropertyName("type")]
public string Type { get; set; }

[JsonPropertyName("photo_50")]
public string Photo50 { get; set; }

[JsonPropertyName("photo_100")]
public string Photo100 { get; set; }

[JsonPropertyName("photo_200")]
public string Photo200 { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;

namespace TaktTusur.Media.Clients.VkApi.GroupInfoResponse;

public class GroupByIdResponse
{
[JsonPropertyName("response")]
public Response Response { get; set; }

[JsonPropertyName("error")]
public Error GroupInfoError { get; set; }
}



10 changes: 10 additions & 0 deletions TaktTusur.Media.Clients.VkApi/GroupInfoResponse/Response.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System.Text.Json.Serialization;

namespace TaktTusur.Media.Clients.VkApi.GroupInfoResponse
{
public class Response
{
[JsonPropertyName("groups")]
public List<Group> Groups { get; set; }
}
}
5 changes: 3 additions & 2 deletions TaktTusur.Media.Clients.VkApi/IVkApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ namespace TaktTusur.Media.Clients.VkApi;

public interface IVkApiClient
{

}
Task<VkGroupInfo> GetGroupInfoAsync(string groupId, CancellationToken cancellationToken);
Task<VkPost> GetPostsAsync(string groupId, int count, CancellationToken cancellationToken);
}
15 changes: 15 additions & 0 deletions TaktTusur.Media.Clients.VkApi/Post.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using TaktTusur.Media.Clients.VkApi.WallByIdResponse;

namespace TaktTusur.Media.Clients.VkApi
{
public class Post
{
public int PostDataTimeOfCreation { get; set; }
public int PostId { get; set; }
public Copyrights PostCopyrightNotes { get; set; } = new Copyrights();
public string PostType { get; set; }
public string PostText { get; set; }
public string PostURL { get; set; }
public List<Attachment> PostAttachment { get; set; } = new List<Attachment>();
}
}
10 changes: 10 additions & 0 deletions TaktTusur.Media.Clients.VkApi/TaktTusur.Media.Clients.VkApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UserSecretsId>09f81f1d-b771-42ca-96e6-981d5c6ead2b</UserSecretsId>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Bogus" Version="34.0.2" />
<PackageReference Include="DocumentFormat.OpenXml" Version="2.20.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
<PackageReference Include="NEST" Version="7.17.5" />
<PackageReference Include="RestEase" Version="1.6.4" />
<PackageReference Include="RestSharp" Version="110.2.0" />
</ItemGroup>

</Project>
Loading

0 comments on commit 3d14a72

Please sign in to comment.