Skip to content

Commit 4b758f6

Browse files
committed
Add TypeForm
1 parent 64a1d8a commit 4b758f6

8 files changed

Lines changed: 205 additions & 3 deletions

File tree

ContestWinnerFromCsv.Tests/ContestWinnerTests.cs renamed to ContestWinnerFromCsv.Tests/GoogleForms/ContestWinnerTestsGoogleForms.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
namespace ContestWinnerFromCsvTests
1313
{
1414
[TestFixture]
15-
public class ContestWinnerTests
15+
public class ContestWinnerTestsGoogleForms
1616
{
1717
private string CsvLocation { get; }
1818
private Settings Settings { get; }
1919
private ContestWinner<GoogleFormsCsvModel, GoogleFormsCsvMap> ContestWinner { get; set; }
2020
public ICsvRepository<GoogleFormsCsvModel, GoogleFormsCsvMap> Repository { get; set; }
2121

22-
public ContestWinnerTests()
22+
public ContestWinnerTestsGoogleForms()
2323
{
2424
Repository = new StubCsvRepository<GoogleFormsCsvModel, GoogleFormsCsvMap>
2525
(GoogleTestData.TestData());
File renamed without changes.
File renamed without changes.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using ContestWinnerFromCsv;
2+
using ContestWinnerFromCsv.FormServices;
3+
using FluentAssertions;
4+
using NUnit.Framework;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.IO;
8+
using System.Linq;
9+
using System.Text;
10+
11+
namespace ContestWinnerFromCsvTests.TypeForm
12+
{
13+
[TestFixture]
14+
public class ContestWinnerTestsTypeForm
15+
{
16+
private string CsvLocation { get; }
17+
private Settings Settings { get; }
18+
private ContestWinner<TypeFormCsvModel, TypeFormCsvMap> ContestWinner { get; set; }
19+
public ICsvRepository<TypeFormCsvModel, TypeFormCsvMap> Repository { get; set; }
20+
21+
public ContestWinnerTestsTypeForm()
22+
{
23+
Repository = new StubCsvRepository<TypeFormCsvModel, TypeFormCsvMap>
24+
(TypeFormTestData.TestData());
25+
26+
CsvLocation = Path.Combine(Environment.CurrentDirectory, "responses.csv");
27+
Settings = GoogleTestData.TestSettings();
28+
ContestWinner = new ContestWinner<TypeFormCsvModel, TypeFormCsvMap>
29+
(Settings, Repository);
30+
}
31+
32+
[Test]
33+
public void ContestWinner_Reads_FormattedCsvFile()
34+
{
35+
var sut = ContestWinner.GetEntries().ToList();
36+
37+
sut.Count().Should().BeGreaterThan(0);
38+
}
39+
40+
[Test]
41+
public void ContestWinner_Throws_FileNotFound_WhenGiven_ANonCsvFilePath()
42+
{
43+
Action act = () => new ContestWinner<TypeFormCsvModel, TypeFormCsvMap>
44+
(CsvLocation + "test");
45+
46+
act.Should().Throw<FileNotFoundException>()
47+
.WithMessage("File could not be found.");
48+
}
49+
50+
[Test]
51+
public void GetEntries_ReturnsOnlyEntries_WithinTheValidDateTimeRange()
52+
{
53+
var sut = ContestWinner.GetEntries();
54+
55+
sut.Where(x => x.IsValid == false).Count().Should().Be(0);
56+
}
57+
58+
[Test]
59+
public void GetEntries_ReturnsOnlyEntries_ThatAreValid_AndNotDuplicates()
60+
{
61+
var sut = ContestWinner.GetEntries();
62+
63+
sut.Count().Should().Be(7);
64+
}
65+
66+
[Test]
67+
public void PickWinners_Returns_CorrectNumber_OfWinners()
68+
{
69+
var sut = ContestWinner.PickWinners();
70+
71+
sut.Count().Should().Be(2);
72+
}
73+
74+
[Test]
75+
public void PickWinners_Throws_ArgumentOutOfRangeException_WhenListIsEmpty()
76+
{
77+
var repository = new StubCsvRepository<TypeFormCsvModel, TypeFormCsvMap>
78+
(new List<TypeFormCsvModel>());
79+
80+
Action act = () => new ContestWinner<TypeFormCsvModel, TypeFormCsvMap>
81+
(Settings, repository).PickWinners();
82+
83+
act.Should().Throw<ArgumentOutOfRangeException>()
84+
.WithMessage("CSV is Empty. (Parameter 'records')");
85+
}
86+
}
87+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using ContestWinnerFromCsv;
2+
using ContestWinnerFromCsv.FormServices;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Text;
6+
7+
namespace ContestWinnerFromCsvTests
8+
{
9+
public static class TypeFormTestData
10+
{
11+
public static Settings TestSettings()
12+
{
13+
return new Settings
14+
{
15+
StartDateTimeOfContest = new DateTime(2020, 10, 20),
16+
EndDateTimeOfContest = new DateTime(2020, 11, 20, 08, 30, 00, DateTimeKind.Local),
17+
NumberOfWinners = 2
18+
};
19+
}
20+
21+
public static List<TypeFormCsvModel> TestData()
22+
{
23+
var contestStart = TestSettings().StartDateTimeOfContest;
24+
var contestEnd = TestSettings().EndDateTimeOfContest;
25+
26+
var list = new List<TypeFormCsvModel>()
27+
{
28+
new TypeFormCsvModel { Name = "Anna", Email = "Anna@email.com", TwitterName = "Anna", TimeStamp= new DateTime(2020,11,05,8,33,43) },
29+
new TypeFormCsvModel { Name = "Bob", Email = "Bob@email.copm", TwitterName = "Bob", TimeStamp= new DateTime(2020,11,05,8,33,43) },
30+
new TypeFormCsvModel { Name = "Chris", Email = "Chris@email", TwitterName = "Chris", TimeStamp= new DateTime(2020, 11, 05, 8, 33, 43) },
31+
new TypeFormCsvModel { Name = "Derrick", Email = "Derrick@email", TwitterName = "Derrick", TimeStamp= new DateTime(2020, 11, 20, 8, 33, 43) },
32+
new TypeFormCsvModel { Name = "Ed", Email = "Ed@email", TwitterName = "Ed", TimeStamp= new DateTime(2020,11,05,8,33,43) },
33+
new TypeFormCsvModel { Name = "Frank", Email = "Frank@email", TwitterName = "Frank", TimeStamp= new DateTime(2020,11,21,8,33,43) },
34+
new TypeFormCsvModel { Name = "Gary", Email = "Gary@email", TwitterName = "Gary", TimeStamp= new DateTime(2020,11,05,8,33,43) },
35+
new TypeFormCsvModel { Name = "Heather", Email = "Heather@email", TwitterName = "Heather", TimeStamp= new DateTime(2020,11,23,8,33,43) },
36+
new TypeFormCsvModel { Name = "Isabelle", Email = "Isabelle@email", TwitterName = "Isabelle", TimeStamp= new DateTime(2020,11,05,8,33,43) },
37+
new TypeFormCsvModel { Name = "Jackie", Email = "Jackie@email", TwitterName = "Jackie", TimeStamp= new DateTime(2020,11,05,8,33,43) },
38+
new TypeFormCsvModel { Name = "Isabelle", Email = "Isabelle@email", TwitterName = "Isabelle", TimeStamp= new DateTime(2020,11,05,8,33,43) },
39+
new TypeFormCsvModel { Name = "Jackie", Email = "Jackie@email", TwitterName = "Jackie", TimeStamp= new DateTime(2020,11,05,8,33,43) }
40+
};
41+
42+
foreach (var item in list)
43+
{
44+
item.SetTimeStampAndValidate(contestStart, contestEnd);
45+
}
46+
47+
return list;
48+
}
49+
50+
}
51+
}

ContestWinnerFromCsv/ContestWinnerFromCsv.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
<PackageProjectUrl>https://github.com/Programazing/ContestWinnerFromCsv</PackageProjectUrl>
99
<RepositoryUrl>https://github.com/Programazing/ContestWinnerFromCsv</RepositoryUrl>
1010
<AssemblyVersion>1.0.0.0</AssemblyVersion>
11-
<Version>1.0.0</Version>
11+
<Version>1.1.0</Version>
1212
<FileVersion>1.0.0.0</FileVersion>
1313
<PackageLicenseExpression>MIT</PackageLicenseExpression>
14+
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
15+
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
1416
</PropertyGroup>
1517

1618
<ItemGroup>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using CsvHelper.Configuration;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
6+
namespace ContestWinnerFromCsv.FormServices
7+
{
8+
public class TypeFormCsvMap : ClassMap<TypeFormCsvModel>
9+
{
10+
public TypeFormCsvMap()
11+
{
12+
Map(m => m.TimeStamp).Name("Submit Date (UTC)");
13+
Map(m => m.Email);
14+
Map(m => m.Name);
15+
Map(m => m.TwitterName).Name("Twitter Name");
16+
}
17+
}
18+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics.CodeAnalysis;
4+
using System.Text;
5+
6+
namespace ContestWinnerFromCsv.FormServices
7+
{
8+
public class TypeFormCsvModel : ICsvModel
9+
{
10+
public DateTime TimeStamp { get; set; }
11+
public string Email { get; set; }
12+
public string Name { get; set; }
13+
public string TwitterName { get; set; }
14+
public bool IsValid { get; set; } = false;
15+
16+
public void SetTimeStampAndValidate(DateTime contestStart, DateTime contestEnd)
17+
{
18+
if (TimeStamp >= contestStart && TimeStamp < contestEnd)
19+
{
20+
IsValid = true;
21+
}
22+
}
23+
24+
public override int GetHashCode()
25+
{
26+
return TwitterName.GetHashCode();
27+
}
28+
29+
public override bool Equals(object obj)
30+
{
31+
return Equals(obj as TypeFormCsvModel);
32+
}
33+
34+
public bool Equals([AllowNull] TypeFormCsvModel other)
35+
{
36+
if (Email == other.Email && TwitterName == other.TwitterName)
37+
{
38+
return true;
39+
}
40+
41+
return false;
42+
}
43+
}
44+
}

0 commit comments

Comments
 (0)