Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[csharp] [courses_steps_csv] Kickstart base #29

Draft
wants to merge 18 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
20e7938
[csharp] [courses_steps_csv] Kickstart base
JavierCane Apr 22, 2021
60ae8c8
[csharp] [courses_steps_csv] Test execution works 🎉
JavierCane Apr 22, 2021
22297c6
[csharp] [courses_steps_csv] Test execution with mock works ✨
JavierCane Apr 22, 2021
f96cfbe
[csharp] [courses_steps_csv] Implement 01 base
ismanapa Apr 26, 2021
d881a3a
[csharp] [courses_steps_csv] Add 02 semantics
ismanapa Apr 26, 2021
127aab0
[csharp] [courses_steps_csv] Provide semantics to video step type
JavierCane Apr 26, 2021
a34e08d
[csharp] [courses_steps_csv] Provide semantics to the overall CourseS…
JavierCane Apr 26, 2021
76559e1
[csharp] [courses_steps_csv] [03_split_parsing_phase] Add base code r…
JavierCane Apr 26, 2021
b5c5410
[csharp] [courses_steps_csv] [03_split_parsing_phase] Duplicate loop …
JavierCane Apr 26, 2021
844007c
[csharp] [courses_steps_csv] Fix mini-typo in file name
JavierCane Apr 26, 2021
8508df1
[csharp] [courses_steps_csv] [03_split_parsing_phase] Clean out the f…
JavierCane Apr 26, 2021
326099d
[csharp] [courses_steps_csv] [03_split_parsing_phase] Refactor the se…
JavierCane Apr 26, 2021
78123d8
[csharp] [courses_steps_csv] [03_split_parsing_phase] Encapsulate `St…
JavierCane Apr 26, 2021
8ed79de
[csharp] [courses_steps_csv] [03_split_parsing_phase] Extract method …
JavierCane Apr 26, 2021
67e5ba0
[csharp] [courses_steps_csv] [04_split_serialization_phase] Add base …
ismanapa Apr 26, 2021
d174ca5
[csharp] [courses_steps_csv] [04_split_serialization_phase] Change se…
ismanapa Apr 26, 2021
83f192f
[csharp] [courses_steps_csv] [04_split_serialization_phase] Extract m…
ismanapa Apr 26, 2021
25f413a
[csharp] [courses_steps_csv] Move FindCourseSteps from ParseCsv to Co…
ismanapa Apr 26, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.6.30114.105
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8B7D4918-2C37-4F16-B355-8EF19B1E23F8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoursesStepsCsv", "src\CoursesStepsCsv\CoursesStepsCsv.csproj", "{C6E9F888-08F3-4D4B-9AEB-919F615C988F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{C8A13F5C-212F-4163-885A-01C093B26450}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoursesStepsCsv.Tests", "test\CoursesStepsCsv.Tests\CoursesStepsCsv.Tests.csproj", "{C6D93799-5C86-410F-A957-1A531A757DAE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x64.ActiveCfg = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x64.Build.0 = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x86.ActiveCfg = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x86.Build.0 = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|Any CPU.Build.0 = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x64.ActiveCfg = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x64.Build.0 = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x86.ActiveCfg = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x86.Build.0 = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x64.ActiveCfg = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x64.Build.0 = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x86.ActiveCfg = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x86.Build.0 = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|Any CPU.Build.0 = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x64.ActiveCfg = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x64.Build.0 = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x86.ActiveCfg = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{C6E9F888-08F3-4D4B-9AEB-919F615C988F} = {8B7D4918-2C37-4F16-B355-8EF19B1E23F8}
{C6D93799-5C86-410F-A957-1A531A757DAE} = {C8A13F5C-212F-4163-885A-01C093B26450}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using Microsoft.VisualBasic.FileIO;

namespace CodelyTv.CoursesStepsCsv
{
public sealed class CourseStepsGetController
{
private readonly Platform platform;

public CourseStepsGetController(Platform platform)
{
this.platform = platform;
}

public string Get(string courseId)
{
var csv = platform.FindCourseSteps(courseId);

var results = "[";

var lines = csv.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < lines.Length; i++)
{
var row = lines[i].Split(',');

var type = row[1];
var duration = 0.0;
var points = 0.0;

if (type == "video")
{
duration = int.Parse(row[3]) * 1.1;
}

if (type == "quiz")
{
duration = int.Parse(row[2]) * 0.5; // 0.5 = time in minutes per question
}

if (type != "video" && type != "quiz")
{
continue;
}

if (type == "video")
{
points = int.Parse(row[3]) * 1.1 * 100;
}

if (type == "quiz")
{
points = int.Parse(row[2]) * 0.5 * 10;
}

var step = new Step
{
Id = row[0],
Type = row[1],
Duration = duration,
Points = points
};

results += JsonSerializer.Serialize(step, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});

if (i != lines.Length - 1)
{
results += ",";
}
}
results += "]";

return results;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

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

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System;

namespace CodelyTv.CoursesStepsCsv
{
public interface Platform
{
string FindCourseSteps(string courseId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

namespace CodelyTv.CoursesStepsCsv
{
public sealed class Step
{
public string Id { get; set; }
public string Type { get; set; }
public double Duration { get; set; }
public double Points { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using System;
using Xunit;
using Moq;

namespace CodelyTv.CoursesStepsCsv.Tests
{
public class CourseStepsGetControllerShould
{
private readonly Mock<Platform> platform;
private readonly CourseStepsGetController courseStepsGetController;
public CourseStepsGetControllerShould()
{
platform = new Mock<Platform>();
courseStepsGetController = new CourseStepsGetController(platform.Object);
}

[Fact]
public void ReturnEmptyStepList()
{
var courseId = "8fe17ce6-1d33-4b6b-a27c-4e0d1f870a19";
var emptyCsv = "";

GivenPlatformReturnsCourseStepCsv(courseId, emptyCsv);

var actualCourseSteps = courseStepsGetController.Get(courseId);

Assert.Equal("[]", actualCourseSteps);
}

[Fact]
public void ReturnExistingCourseSteps()
{
var courseId = "8fe17ce6-1d33-4b6b-a27c-4e0d1f870a19";
var csv = String.Join(
Environment.NewLine,
"1,video,,13",
"2,quiz,5,");
GivenPlatformReturnsCourseStepCsv(courseId, csv);

var results = courseStepsGetController.Get(courseId);

var expected = "[{\"id\":\"1\",\"type\":\"video\",\"duration\":14.3,\"points\":1430},{\"id\":\"2\",\"type\":\"quiz\",\"duration\":2.5,\"points\":25}]";
Assert.Equal(expected, results);
}

[Fact]
public void IgnoreStepsWithInvalidType()
{
var courseId = "8fe17ce6-1d33-4b6b-a27c-4e0d1f870a19";
var csv = "1,survey,,13";
GivenPlatformReturnsCourseStepCsv(courseId, csv);

var results = courseStepsGetController.Get(courseId);

Assert.Equal("[]", results);
}

private void GivenPlatformReturnsCourseStepCsv(string courseId, string csv)
{
platform.Setup(x => x.FindCourseSteps(courseId)).Returns(csv);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace>CodelyTv.CoursesStepsCsv.Tests</RootNamespace>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<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>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Moq" Version="4.13.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\CoursesStepsCsv\CoursesStepsCsv.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.6.30114.105
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8B7D4918-2C37-4F16-B355-8EF19B1E23F8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoursesStepsCsv", "src\CoursesStepsCsv\CoursesStepsCsv.csproj", "{C6E9F888-08F3-4D4B-9AEB-919F615C988F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{C8A13F5C-212F-4163-885A-01C093B26450}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoursesStepsCsv.Tests", "test\CoursesStepsCsv.Tests\CoursesStepsCsv.Tests.csproj", "{C6D93799-5C86-410F-A957-1A531A757DAE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x64.ActiveCfg = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x64.Build.0 = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x86.ActiveCfg = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Debug|x86.Build.0 = Debug|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|Any CPU.Build.0 = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x64.ActiveCfg = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x64.Build.0 = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x86.ActiveCfg = Release|Any CPU
{C6E9F888-08F3-4D4B-9AEB-919F615C988F}.Release|x86.Build.0 = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x64.ActiveCfg = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x64.Build.0 = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x86.ActiveCfg = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Debug|x86.Build.0 = Debug|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|Any CPU.Build.0 = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x64.ActiveCfg = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x64.Build.0 = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x86.ActiveCfg = Release|Any CPU
{C6D93799-5C86-410F-A957-1A531A757DAE}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{C6E9F888-08F3-4D4B-9AEB-919F615C988F} = {8B7D4918-2C37-4F16-B355-8EF19B1E23F8}
{C6D93799-5C86-410F-A957-1A531A757DAE} = {C8A13F5C-212F-4163-885A-01C093B26450}
EndGlobalSection
EndGlobal
Loading