Skip to content

Commit

Permalink
Setup unit tests and add companies controller
Browse files Browse the repository at this point in the history
  • Loading branch information
vbilopav committed Apr 19, 2021
1 parent 7294c74 commit 79d03ca
Show file tree
Hide file tree
Showing 23 changed files with 495 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@ public static Company CreateOnConflictDoUpdateReturningCompanies(this NpgsqlConn
.Read<Company>(Sql(model, conflictedFields.Length == 0 ? new string[] { "id" } : conflictedFields),
("id", model.Id, NpgsqlDbType.Bigint),
("name", model.Name, NpgsqlDbType.Varchar),
("name_normalized", model.NameNormalized, NpgsqlDbType.Varchar),
("nameNormalized", model.NameNormalized, NpgsqlDbType.Varchar),
("website", model.Website, NpgsqlDbType.Varchar),
("area_id", model.AreaId, NpgsqlDbType.Integer),
("areaId", model.AreaId, NpgsqlDbType.Integer),
("about", model.About, NpgsqlDbType.Varchar),
("modified", model.Modified, NpgsqlDbType.Timestamp))
.SingleOrDefault();
Expand All @@ -91,9 +91,9 @@ public static async ValueTask<Company> CreateOnConflictDoUpdateReturningCompanie
.ReadAsync<Company>(Sql(model, conflictedFields.Length == 0 ? new string[] { "id" } : conflictedFields),
("id", model.Id, NpgsqlDbType.Bigint),
("name", model.Name, NpgsqlDbType.Varchar),
("name_normalized", model.NameNormalized, NpgsqlDbType.Varchar),
("nameNormalized", model.NameNormalized, NpgsqlDbType.Varchar),
("website", model.Website, NpgsqlDbType.Varchar),
("area_id", model.AreaId, NpgsqlDbType.Integer),
("areaId", model.AreaId, NpgsqlDbType.Integer),
("about", model.About, NpgsqlDbType.Varchar),
("modified", model.Modified, NpgsqlDbType.Timestamp))
.SingleOrDefaultAsync();
Expand Down
8 changes: 4 additions & 4 deletions CompaniesWebBlazor/CompaniesDb/Extensions/SearchCompanies.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ public static class PgRoutineSearchCompanies
///
/// Search companies by filter and return data page with results.
/// Parameters:
/// - `_filter` is `json` with following schema `{"search", "area_id"}`
/// - `_filter` is `json` with following schema `{"search", "areaId"}`
/// - `page` page indexed from 1
/// - `page_size`, default is 25
///
/// Returning json schema:
/// `{"count", {"id", "name", "website", "area", "about", "modified"}}`
/// `{"count", "page": {"id", "name", "website", "area", "about", "modified"}}`
///
/// </summary>
/// <param name="filter">_filter json</param>
Expand All @@ -46,12 +46,12 @@ public static string SearchCompanies(this NpgsqlConnection connection, string fi
///
/// Search companies by filter and return data page with results.
/// Parameters:
/// - `_filter` is `json` with following schema `{"search", "area_id"}`
/// - `_filter` is `json` with following schema `{"search", "areaId"}`
/// - `page` page indexed from 1
/// - `page_size`, default is 25
///
/// Returning json schema:
/// `{"count", {"id", "name", "website", "area", "about", "modified"}}`
/// `{"count", "page": {"id", "name", "website", "area", "about", "modified"}}`
///
/// </summary>
/// <param name="filter">_filter json</param>
Expand Down
6 changes: 3 additions & 3 deletions CompaniesWebBlazor/CompaniesDb/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Dictionary for database `companies_web_demo`

- Server: PostgreSQL `localhost:5434`, version `12.0`
- Local time stamp: `2021-04-19T12:08:18.9463833+02:00`
- Local time stamp: `2021-04-19T14:05:33.3375168+02:00`
- Schema: public

## Table of Contents
Expand Down Expand Up @@ -57,7 +57,7 @@ Search companies by filter and return data page with results.

Parameters:

- `_filter` is `json` with following schema `{"search", "area_id"}`
- `_filter` is `json` with following schema `{"search", "areaId"}`

- `page` page indexed from 1

Expand All @@ -67,7 +67,7 @@ Parameters:

Returning json schema:

`{"count", {"id", "name", "website", "area", "about", "modified"}}`
`{"count", "page": {"id", "name", "website", "area", "about", "modified"}}`


<!-- end -->
Expand Down
7 changes: 0 additions & 7 deletions CompaniesWebBlazor/CompaniesDb/Scripts/Data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,6 @@ INSERT INTO public.company_areas OVERRIDING SYSTEM VALUE VALUES (8, 'Trade');
INSERT INTO public.company_areas OVERRIDING SYSTEM VALUE VALUES (9, 'Manufacturing');
INSERT INTO public.company_areas OVERRIDING SYSTEM VALUE VALUES (10, 'Transportation');
--
-- Data for Name: companies; Type: TABLE DATA; Schema: public; Owner: postgres
--
--
-- Name: companies_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
PERFORM pg_catalog.setval('public.companies_id_seq', 1, false);
--
-- Name: company_areas_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
PERFORM pg_catalog.setval('public.company_areas_id_seq', 10, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,27 @@ declare
_search varchar;
_area_id int;
begin
_search := _filter->'search';
_area_id := _filter->'area_id';
_search := _filter->>'search';
_area_id := _filter->>'areaId';

if _search = '' then
_search := null;
end if;

if _search is not null then
_search := '%' || lower(_search) || '%';
_search := lower(_search);
end if;

raise info '%', _search;
raise info '%', _area_id;

create temp table companies_tmp on commit drop as
select
id
from
companies
where
(_search is null or name_normalized like _search)
(_search is null or name_normalized = _search or name_normalized like '%' || _search || '%')
and (_area_id is null or area_id = _area_id);

return json_build_object(
Expand All @@ -31,7 +35,7 @@ begin
(select json_agg(
json_build_object(
'id', id,
'name', name,
'name', name,
'website', website,
'area', area,
'about', about,
Expand All @@ -41,8 +45,8 @@ begin
from (

select
c.id,
name,
t.id,
c.name,
website,
ca.name as area,
about,
Expand All @@ -52,11 +56,12 @@ begin
inner join companies c on t.id = c.id
inner join company_areas ca on c.area_id = ca.id
order by
l.id
t.id
limit
_page_size
offset
_page_size * (_page - 1)

) sub
),
'[]'::json))
Expand All @@ -67,9 +72,9 @@ $$;
COMMENT ON FUNCTION public.search_companies(_filter json, _page integer, _page_size integer) IS '
Search companies by filter and return data page with results.
Parameters:
- `_filter` is `json` with following schema `{"search", "area_id"}`
- `_filter` is `json` with following schema `{"search", "areaId"}`
- `page` page indexed from 1
- `page_size`, default is 25
Returning json schema:
`{"count", {"id", "name", "website", "area", "about", "modified"}}`
`{"count", "page": {"id", "name", "website", "area", "about", "modified"}}`
';
25 changes: 15 additions & 10 deletions CompaniesWebBlazor/CompaniesDb/Scripts/Schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,27 @@ declare
_search varchar;
_area_id int;
begin
_search := _filter->'search';
_area_id := _filter->'area_id';
_search := _filter->>'search';
_area_id := _filter->>'areaId';

if _search = '' then
_search := null;
end if;

if _search is not null then
_search := '%' || lower(_search) || '%';
_search := lower(_search);
end if;

raise info '%', _search;
raise info '%', _area_id;

create temp table companies_tmp on commit drop as
select
id
from
companies
where
(_search is null or name_normalized like _search)
(_search is null or name_normalized = _search or name_normalized like '%' || _search || '%')
and (_area_id is null or area_id = _area_id);

return json_build_object(
Expand All @@ -58,7 +62,7 @@ begin
(select json_agg(
json_build_object(
'id', id,
'name', name,
'name', name,
'website', website,
'area', area,
'about', about,
Expand All @@ -68,8 +72,8 @@ begin
from (

select
c.id,
name,
t.id,
c.name,
website,
ca.name as area,
about,
Expand All @@ -79,11 +83,12 @@ begin
inner join companies c on t.id = c.id
inner join company_areas ca on c.area_id = ca.id
order by
l.id
t.id
limit
_page_size
offset
_page_size * (_page - 1)

) sub
),
'[]'::json))
Expand All @@ -96,11 +101,11 @@ $$;
COMMENT ON FUNCTION public.search_companies(_filter json, _page integer, _page_size integer) IS '
Search companies by filter and return data page with results.
Parameters:
- `_filter` is `json` with following schema `{"search", "area_id"}`
- `_filter` is `json` with following schema `{"search", "areaId"}`
- `page` page indexed from 1
- `page_size`, default is 25
Returning json schema:
`{"count", {"id", "name", "website", "area", "about", "modified"}}`
`{"count", "page": {"id", "name", "website", "area", "about", "modified"}}`
';
SET default_tablespace = '';
SET default_table_access_method = heap;
Expand Down
2 changes: 1 addition & 1 deletion CompaniesWebBlazor/CompaniesDb/appsettings.PgRoutiner.json
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@
"DataDumpFile": "./Scripts/Data.sql",
"DataDumpOverwrite": true,
"DataDumpAskOverwrite": false,
"DataDumpTables": [],
"DataDumpTables": [ "company_areas" ],
"DataDumpOptions": null,
"DataDumpNoTransaction": false,

Expand Down
38 changes: 38 additions & 0 deletions CompaniesWebBlazor/CompaniesDbTests/CompaniesDbTests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<None Update="testsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\CompaniesDb\CompaniesDb.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="3.0.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="FluentAssertions" Version="5.10.3" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
<PackageReference Include="Norm.net" Version="3.2.0" />
<PackageReference Include="Npgsql" Version="5.0.4" />
<PackageReference Include="System.Linq.Async" Version="5.0.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// <auto-generated />
using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using Norm;
using FluentAssertions;
using CompaniesDb.Extensions;
using CompaniesWebBlazor.Shared;

namespace CompaniesDbTests
{
public class CreateOnConflictDoUpdateReturningCompaniesUnitTests : PostgreSqlUnitTestFixture
{
public CreateOnConflictDoUpdateReturningCompaniesUnitTests(PostgreSqlFixture fixture) : base(fixture) { }

[Fact]
public void CreateOnConflictDoUpdateReturningCompanies_Test1()
{
// Arrange
var model = new Company { Name = "n", NameNormalized = "nn", About = "about", AreaId = 1, Website = "website" };

// Act
var result = Connection.CreateOnConflictDoUpdateReturningCompanies(model);

// Assert
model.Should().BeEquivalentTo(result,
o => o.Excluding(c => c.Id).Excluding(c => c.Modified)); // Id and Modified are generated fields
}

[Fact]
public void CreateOnConflictDoUpdateReturningCompanies_Test2_Upsert()
{
// Arrange
var model1 = new Company { Name = "n", NameNormalized = "nn", About = "about", AreaId = 1, Website = "website" };
var model2 = new Company { Name = "n2", NameNormalized = "nn", About = "about2", AreaId = 1, Website = "website2" };

// Act
var result1 = Connection.CreateOnConflictDoUpdateReturningCompanies(model1);
var result2 = Connection.CreateOnConflictDoUpdateReturningCompanies(model2, "name_normalized"); // name_normalized is unique index

// Assert
model2.Should().BeEquivalentTo(result2,
o => o.Excluding(c => c.Id).Excluding(c => c.Modified)); // Id and Modified are generated fields
Assert.Equal(result1.Id, result2.Id); // confirm that it is indeed same record updated
}
}
}
32 changes: 32 additions & 0 deletions CompaniesWebBlazor/CompaniesDbTests/DeleteCompaniesUnitTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// <auto-generated />
using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using Norm;
using FluentAssertions;
using CompaniesDb.Extensions;
using CompaniesWebBlazor.Shared;

namespace CompaniesDbTests
{
public class DeleteCompaniesUnitTests : PostgreSqlUnitTestFixture
{
public DeleteCompaniesUnitTests(PostgreSqlFixture fixture) : base(fixture) { }

[Fact]
public void DeleteCompanies_Test1()
{
// Arrange
var model = new Company { Name = "n", NameNormalized = "nn", About = "about", AreaId = 1, Website = "website" };
var result = Connection.CreateOnConflictDoUpdateReturningCompanies(model);

// Act
Connection.DeleteCompanies(result);

// Assert
Assert.False(Connection.Read($"select * from {CompaniesDelete.Name} where id = {result.Id}").Any());
}
}
}
Loading

0 comments on commit 79d03ca

Please sign in to comment.