From c9af2a6aae0e8c1106fbe8bfb9b3e12b1119d169 Mon Sep 17 00:00:00 2001 From: mnsasha Date: Thu, 16 Apr 2015 21:39:06 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BuildRevisionCounter.Contract.csproj | 54 ++++++++ .../Properties/AssemblyInfo.cs | 36 ++++++ BuildRevisionCounter.Contract/Revision.cs | 15 +++ BuildRevisionCounter.Contract/User.cs | 11 ++ .../App.config | 9 ++ ...visionCounter.Core.Test.Integration.csproj | 114 +++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 ++++++ .../RevisionRepositoryTest.cs | 106 ++++++++++++++++ .../packages.config | 7 ++ .../BuildRevisionCounter.Core.csproj | 98 +++++++++++++++ .../Converters/RevisionConverter.cs | 22 ++++ .../Converters/UserConverter.cs | 22 ++++ .../DomainObjects/Revision.cs | 20 +++ .../DomainObjects/User.cs | 4 +- BuildRevisionCounter.Core/MongoDBStorage.cs | 71 +++++++++++ .../Properties/AssemblyInfo.cs | 36 ++++++ .../Repositories/IRevisionRepository.cs | 12 ++ .../Repositories/IUserRepository.cs | 10 ++ .../Repositories/Impl/RevisionRepository.cs | 54 ++++++++ .../Repositories/Impl/UserRepository.cs | 23 ++++ BuildRevisionCounter.Core/packages.config | 8 ++ BuildRevisionCounter.sln | 22 +++- .../BuildRevisionCounter.csproj | 20 ++- .../Controllers/CounterController.cs | 18 +-- BuildRevisionCounter/Model/RevisionModel.cs | 24 ---- BuildRevisionCounter/MongoDBStorage.cs | 63 ---------- .../Security/BasicAuthenticationAttribute.cs | 119 ++++++++++++++++++ BuildRevisionCounter/Web.config | 3 + 28 files changed, 924 insertions(+), 113 deletions(-) create mode 100644 BuildRevisionCounter.Contract/BuildRevisionCounter.Contract.csproj create mode 100644 BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs create mode 100644 BuildRevisionCounter.Contract/Revision.cs create mode 100644 BuildRevisionCounter.Contract/User.cs create mode 100644 BuildRevisionCounter.Core.Test.Integration/App.config create mode 100644 BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj create mode 100644 BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs create mode 100644 BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs create mode 100644 BuildRevisionCounter.Core.Test.Integration/packages.config create mode 100644 BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj create mode 100644 BuildRevisionCounter.Core/Converters/RevisionConverter.cs create mode 100644 BuildRevisionCounter.Core/Converters/UserConverter.cs create mode 100644 BuildRevisionCounter.Core/DomainObjects/Revision.cs rename BuildRevisionCounter/Model/UserModel.cs => BuildRevisionCounter.Core/DomainObjects/User.cs (77%) create mode 100644 BuildRevisionCounter.Core/MongoDBStorage.cs create mode 100644 BuildRevisionCounter.Core/Properties/AssemblyInfo.cs create mode 100644 BuildRevisionCounter.Core/Repositories/IRevisionRepository.cs create mode 100644 BuildRevisionCounter.Core/Repositories/IUserRepository.cs create mode 100644 BuildRevisionCounter.Core/Repositories/Impl/RevisionRepository.cs create mode 100644 BuildRevisionCounter.Core/Repositories/Impl/UserRepository.cs create mode 100644 BuildRevisionCounter.Core/packages.config delete mode 100644 BuildRevisionCounter/Model/RevisionModel.cs delete mode 100644 BuildRevisionCounter/MongoDBStorage.cs diff --git a/BuildRevisionCounter.Contract/BuildRevisionCounter.Contract.csproj b/BuildRevisionCounter.Contract/BuildRevisionCounter.Contract.csproj new file mode 100644 index 0000000..79640ea --- /dev/null +++ b/BuildRevisionCounter.Contract/BuildRevisionCounter.Contract.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {667844E5-6D11-474D-A18F-BC4784626F34} + Library + Properties + BuildRevisionCounter.Contract + BuildRevisionCounter.Contract + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs b/BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6660509 --- /dev/null +++ b/BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BuildRevisionCounter.Contract")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BuildRevisionCounter.Contract")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("91410165-4321-4bb2-9665-c1c0e36dc1d4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BuildRevisionCounter.Contract/Revision.cs b/BuildRevisionCounter.Contract/Revision.cs new file mode 100644 index 0000000..e9aa232 --- /dev/null +++ b/BuildRevisionCounter.Contract/Revision.cs @@ -0,0 +1,15 @@ +using System; + +namespace BuildRevisionCounter.Contract +{ + public class Revision + { + public string Id { get; set; } + + public DateTime Created { get; set; } + + public DateTime Updated { get; set; } + + public long NextNumber { get; set; } + } +} \ No newline at end of file diff --git a/BuildRevisionCounter.Contract/User.cs b/BuildRevisionCounter.Contract/User.cs new file mode 100644 index 0000000..307da7d --- /dev/null +++ b/BuildRevisionCounter.Contract/User.cs @@ -0,0 +1,11 @@ +namespace BuildRevisionCounter.Contract +{ + public class User + { + public string Name { get; set; } + + public string Password { get; set; } + + public string[] Roles { get; set; } + } +} \ No newline at end of file diff --git a/BuildRevisionCounter.Core.Test.Integration/App.config b/BuildRevisionCounter.Core.Test.Integration/App.config new file mode 100644 index 0000000..516137f --- /dev/null +++ b/BuildRevisionCounter.Core.Test.Integration/App.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj b/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj new file mode 100644 index 0000000..6db8249 --- /dev/null +++ b/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj @@ -0,0 +1,114 @@ + + + + Debug + AnyCPU + {7F67AE85-60DC-42EC-9231-51694390ECE4} + Library + Properties + BuildRevisionCounter.Core.Test.Integration + BuildRevisionCounter.Core.Test.Integration + v4.5.1 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\MongoDB.Bson.2.0.0\lib\net45\MongoDB.Bson.dll + True + + + ..\packages\MongoDB.Driver.2.0.0\lib\net45\MongoDB.Driver.dll + True + + + ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll + True + + + ..\packages\mongocsharpdriver.2.0.0\lib\net45\MongoDB.Driver.Legacy.dll + True + + + + + + + + + + + + + + + + + + + + {667844E5-6D11-474D-A18F-BC4784626F34} + BuildRevisionCounter.Contract + + + {ddf51396-4ee1-45af-b134-ca1c56b0cd9f} + BuildRevisionCounter.Core + + + + + Designer + + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs b/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..700c461 --- /dev/null +++ b/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BuildRevisionCounter.Core.Test.Integration")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BuildRevisionCounter.Core.Test.Integration")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4a25a19a-0cbd-45de-9e2d-e67ad9aa526d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs b/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs new file mode 100644 index 0000000..30699b4 --- /dev/null +++ b/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs @@ -0,0 +1,106 @@ +using System.Threading.Tasks; +using BuildRevisionCounter.Core.DomainObjects; +using BuildRevisionCounter.Core.Repositories.Impl; +using MongoDB.Driver; +using NUnit.Framework; + +namespace BuildRevisionCounter.Core.Test.Integration +{ + [TestFixture] + public class RevisionRepositoryTest + { + private RevisionTestHelper _dbHelper; + private RevisionRepository _repository; + + [TestFixtureSetUp] + public void ClassSetUp() + { + _dbHelper = new RevisionTestHelper(); + _repository = new RevisionRepository(); + } + + [SetUp] + public void TestSetUp() + { + _dbHelper.ClearRevisionCollectionAsync().Wait(); + } + + [Test] + public async void GetRevisionByIdAsync_WhenIdNotExists_ReturnNull() + { + // Act + var revision = await _repository.GetRevisionByIdAsync("unknownRev"); + + // Assert + Assert.IsNull(revision); + } + + [Test] + public async void GetRevisionByIdAsync_WhenIdExists_ReturnRevision() + { + // Arrange + const string expectedRevId = "testRev"; + var expectedRev = new Revision { Id = expectedRevId }; + await _dbHelper.AddRevisionAsync(expectedRev); + + // Act + var actualRev = await _repository.GetRevisionByIdAsync(expectedRevId); + var actualRevId = actualRev.Id; + + // Asert + Assert.AreEqual(expectedRevId, actualRevId); + } + + [Test] + public async void IncrementRevisionAsync_WhenNotExist_CreateWithNumberOne() + { + // Arrange + const int expectedNextNumber = 1; + const string revId = "testRev"; + + // Act + var newRevision = await _repository.IncrementRevisionAsync(revId); + var actualNextNumber = newRevision.NextNumber; + + // Assert + Assert.AreEqual(expectedNextNumber, actualNextNumber); + } + + [Test] + public async void IncrementRevisionAsync_WhenExist_IncrementNumber() + { + // Arrange + const string revId = "testRev"; + const int expectedNextNumber = 4; + var expectedRev = new Revision { Id = revId, NextNumber = expectedNextNumber - 1 }; + await _dbHelper.AddRevisionAsync(expectedRev); + + // Act + var actualRev = await _repository.IncrementRevisionAsync(revId); + var actualNextNumber = actualRev.NextNumber; + + // Assert + Assert.AreEqual(expectedNextNumber, actualNextNumber); + } + } + + internal sealed class RevisionTestHelper + { + private readonly MongoContext _storage; + + internal RevisionTestHelper() + { + _storage = MongoContext.Instance; + } + + internal async Task AddRevisionAsync(Revision revision) + { + await _storage.Revisions.InsertOneAsync(revision); + } + + internal async Task ClearRevisionCollectionAsync() + { + await _storage.Revisions.DeleteManyAsync(l => true); + } + } +} diff --git a/BuildRevisionCounter.Core.Test.Integration/packages.config b/BuildRevisionCounter.Core.Test.Integration/packages.config new file mode 100644 index 0000000..c276a7f --- /dev/null +++ b/BuildRevisionCounter.Core.Test.Integration/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj b/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj new file mode 100644 index 0000000..3523acb --- /dev/null +++ b/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj @@ -0,0 +1,98 @@ + + + + + Debug + AnyCPU + {DDF51396-4EE1-45AF-B134-CA1C56B0CD9F} + Library + Properties + BuildRevisionCounter.Core + BuildRevisionCounter.Core + v4.5.1 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll + True + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll + True + + + ..\packages\MongoDB.Bson.2.0.0\lib\net45\MongoDB.Bson.dll + True + + + ..\packages\MongoDB.Driver.2.0.0\lib\net45\MongoDB.Driver.dll + True + + + ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll + True + + + ..\packages\mongocsharpdriver.2.0.0\lib\net45\MongoDB.Driver.Legacy.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + {667844e5-6d11-474d-a18f-bc4784626f34} + BuildRevisionCounter.Contract + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter.Core/Converters/RevisionConverter.cs b/BuildRevisionCounter.Core/Converters/RevisionConverter.cs new file mode 100644 index 0000000..d159147 --- /dev/null +++ b/BuildRevisionCounter.Core/Converters/RevisionConverter.cs @@ -0,0 +1,22 @@ +using AutoMapper; +using BuildRevisionCounter.Core.DomainObjects; + +namespace BuildRevisionCounter.Core.Converters +{ + public static class RevisionConverter + { + static RevisionConverter() + { + Mapper.CreateMap(); + } + + public static Contract.Revision ToContract(this Revision revision) + { + var revisionContract = new Contract.Revision(); + + Mapper.Map(revision, revisionContract); + + return revisionContract; + } + } +} \ No newline at end of file diff --git a/BuildRevisionCounter.Core/Converters/UserConverter.cs b/BuildRevisionCounter.Core/Converters/UserConverter.cs new file mode 100644 index 0000000..ab57821 --- /dev/null +++ b/BuildRevisionCounter.Core/Converters/UserConverter.cs @@ -0,0 +1,22 @@ +using AutoMapper; +using BuildRevisionCounter.Core.DomainObjects; + +namespace BuildRevisionCounter.Core.Converters +{ + public static class UserConverter + { + static UserConverter() + { + Mapper.CreateMap(); + } + + public static Contract.User ToContract(this User user) + { + var userContract = new Contract.User(); + + Mapper.Map(user, userContract); + + return userContract; + } + } +} \ No newline at end of file diff --git a/BuildRevisionCounter.Core/DomainObjects/Revision.cs b/BuildRevisionCounter.Core/DomainObjects/Revision.cs new file mode 100644 index 0000000..594e6a2 --- /dev/null +++ b/BuildRevisionCounter.Core/DomainObjects/Revision.cs @@ -0,0 +1,20 @@ +using System; +using MongoDB.Bson.Serialization.Attributes; + +namespace BuildRevisionCounter.Core.DomainObjects +{ + public class Revision + { + [BsonId] + public string Id; + + [BsonElement("created"), BsonDateTimeOptions(Kind = DateTimeKind.Utc)] + public DateTime Created; + + [BsonElement("updated"), BsonDateTimeOptions(Kind = DateTimeKind.Utc)] + public DateTime Updated; + + [BsonElement("nextNumber")] + public long NextNumber; + } +} \ No newline at end of file diff --git a/BuildRevisionCounter/Model/UserModel.cs b/BuildRevisionCounter.Core/DomainObjects/User.cs similarity index 77% rename from BuildRevisionCounter/Model/UserModel.cs rename to BuildRevisionCounter.Core/DomainObjects/User.cs index 8506596..c42289a 100644 --- a/BuildRevisionCounter/Model/UserModel.cs +++ b/BuildRevisionCounter.Core/DomainObjects/User.cs @@ -1,8 +1,8 @@ using MongoDB.Bson.Serialization.Attributes; -namespace BuildRevisionCounter.Model +namespace BuildRevisionCounter.Core.DomainObjects { - public class UserModel + public class User { [BsonId] public string Name { get; set; } diff --git a/BuildRevisionCounter.Core/MongoDBStorage.cs b/BuildRevisionCounter.Core/MongoDBStorage.cs new file mode 100644 index 0000000..82cf215 --- /dev/null +++ b/BuildRevisionCounter.Core/MongoDBStorage.cs @@ -0,0 +1,71 @@ +using System; +using System.Configuration; +using System.Linq; +using System.Threading; +using BuildRevisionCounter.Core.DomainObjects; +using MongoDB.Driver; +using MongoDB.Driver.Linq; + +namespace BuildRevisionCounter.Core +{ + public class MongoContext + { + private static readonly Object SLock = new Object(); + private static MongoContext _instance = null; + + private readonly IMongoClient _client; + private readonly IMongoDatabase _database; + + private MongoContext() + { + var mongoHost = ConfigurationManager.ConnectionStrings["MongoDBStorage"].ConnectionString; + var mongoDbName = ConfigurationManager.AppSettings.GetValues("MongoDbName").First(); + + _client = new MongoClient(mongoHost); + _database = _client.GetDatabase(mongoDbName); + + CreateAdmin(); + } + + public static MongoContext Instance + { + get + { + if (_instance != null) return _instance; + Monitor.Enter(SLock); + var temp = new MongoContext(); + Interlocked.Exchange(ref _instance, temp); + Monitor.Exit(SLock); + return _instance; + } + } + + public IMongoClient Client + { + get { return _client; } + } + + public IMongoCollection Revisions + { + get { return _database.GetCollection("revisions"); } + } + + public IMongoCollection Users + { + get { return _database.GetCollection("users"); } + } + + private void CreateAdmin() + { + if (Users.Find(l => true).SingleOrDefaultAsync() == null) + { + Users.InsertOneAsync(new User + { + Name = "admin", + Password = "admin", + Roles = new[] { "admin", "buildserver", "editor" } + }); + } + } + } +} \ No newline at end of file diff --git a/BuildRevisionCounter.Core/Properties/AssemblyInfo.cs b/BuildRevisionCounter.Core/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6f453fa --- /dev/null +++ b/BuildRevisionCounter.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BuildRevisionCounter.Core")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BuildRevisionCounter.Core")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b1d43c9f-761a-420c-b9a9-c4beaa5f47f8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BuildRevisionCounter.Core/Repositories/IRevisionRepository.cs b/BuildRevisionCounter.Core/Repositories/IRevisionRepository.cs new file mode 100644 index 0000000..21c5daa --- /dev/null +++ b/BuildRevisionCounter.Core/Repositories/IRevisionRepository.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; +using BuildRevisionCounter.Contract; + +namespace BuildRevisionCounter.Core.Repositories +{ + public interface IRevisionRepository + { + Task GetRevisionByIdAsync(string revisionId); + + Task IncrementRevisionAsync(string revisionId); + } +} diff --git a/BuildRevisionCounter.Core/Repositories/IUserRepository.cs b/BuildRevisionCounter.Core/Repositories/IUserRepository.cs new file mode 100644 index 0000000..4750103 --- /dev/null +++ b/BuildRevisionCounter.Core/Repositories/IUserRepository.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using BuildRevisionCounter.Contract; + +namespace BuildRevisionCounter.Core.Repositories +{ + public interface IUserRepository + { + Task GetUserByNameAsync(string userName); + } +} \ No newline at end of file diff --git a/BuildRevisionCounter.Core/Repositories/Impl/RevisionRepository.cs b/BuildRevisionCounter.Core/Repositories/Impl/RevisionRepository.cs new file mode 100644 index 0000000..b282991 --- /dev/null +++ b/BuildRevisionCounter.Core/Repositories/Impl/RevisionRepository.cs @@ -0,0 +1,54 @@ +using System; +using System.Threading.Tasks; +using BuildRevisionCounter.Core.Converters; +using BuildRevisionCounter.Core.DomainObjects; +using MongoDB.Driver; + +namespace BuildRevisionCounter.Core.Repositories.Impl +{ + public class RevisionRepository : IRevisionRepository + { + private readonly MongoContext _storage; + + public RevisionRepository() + { + _storage = MongoContext.Instance; + } + + private void CheckRevisionId(string revisionId) + { + if (String.IsNullOrEmpty(revisionId)) throw new ArgumentException("revisionId can't be null or empty", "revisionId"); + } + + public async Task GetRevisionByIdAsync(string revisionId) + { + CheckRevisionId(revisionId); + + var revision = await _storage.Revisions.Find(l => l.Id == revisionId).SingleOrDefaultAsync(); + + if (revision == null) return null; + return revision.ToContract(); + } + + public async Task IncrementRevisionAsync(string revisionId) + { + CheckRevisionId(revisionId); + + var options = new FindOneAndUpdateOptions + { + IsUpsert = true, + ReturnDocument = ReturnDocument.After + }; + + var revision = await _storage.Revisions.FindOneAndUpdateAsync( + Builders.Filter.Eq(r => r.Id, revisionId), + Builders.Update + .SetOnInsert(l => l.Created, DateTime.UtcNow) + .Inc(l => l.NextNumber, 1) + .Set(l => l.Updated, DateTime.UtcNow), + options); + + return revision.ToContract(); + } + } +} diff --git a/BuildRevisionCounter.Core/Repositories/Impl/UserRepository.cs b/BuildRevisionCounter.Core/Repositories/Impl/UserRepository.cs new file mode 100644 index 0000000..73c18ca --- /dev/null +++ b/BuildRevisionCounter.Core/Repositories/Impl/UserRepository.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using BuildRevisionCounter.Core.Converters; +using MongoDB.Driver; + +namespace BuildRevisionCounter.Core.Repositories.Impl +{ + public class UserRepository : IUserRepository + { + private readonly MongoContext _storage; + + public UserRepository() + { + _storage = MongoContext.Instance; + } + + public async Task GetUserByNameAsync(string userName) + { + var user = await _storage.Users.Find(l => l.Name == userName).SingleOrDefaultAsync(); + + return user.ToContract(); + } + } +} \ No newline at end of file diff --git a/BuildRevisionCounter.Core/packages.config b/BuildRevisionCounter.Core/packages.config new file mode 100644 index 0000000..f8aaae0 --- /dev/null +++ b/BuildRevisionCounter.Core/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter.sln b/BuildRevisionCounter.sln index e504ccf..09bceb3 100644 --- a/BuildRevisionCounter.sln +++ b/BuildRevisionCounter.sln @@ -5,7 +5,11 @@ VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildRevisionCounter", "BuildRevisionCounter\BuildRevisionCounter.csproj", "{64EEEA30-FCE1-4AA6-A375-EBD721914708}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildRevisionCounter.Tests", "BuildRevisionCounter.Tests\BuildRevisionCounter.Tests.csproj", "{837D9E7D-D0CC-4924-85B5-916FC5D931BA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildRevisionCounter.Core", "BuildRevisionCounter.Core\BuildRevisionCounter.Core.csproj", "{DDF51396-4EE1-45AF-B134-CA1C56B0CD9F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildRevisionCounter.Contract", "BuildRevisionCounter.Contract\BuildRevisionCounter.Contract.csproj", "{667844E5-6D11-474D-A18F-BC4784626F34}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildRevisionCounter.Core.Test.Integration", "BuildRevisionCounter.Core.Test.Integration\BuildRevisionCounter.Core.Test.Integration.csproj", "{7F67AE85-60DC-42EC-9231-51694390ECE4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -17,10 +21,18 @@ Global {64EEEA30-FCE1-4AA6-A375-EBD721914708}.Debug|Any CPU.Build.0 = Debug|Any CPU {64EEEA30-FCE1-4AA6-A375-EBD721914708}.Release|Any CPU.ActiveCfg = Release|Any CPU {64EEEA30-FCE1-4AA6-A375-EBD721914708}.Release|Any CPU.Build.0 = Release|Any CPU - {837D9E7D-D0CC-4924-85B5-916FC5D931BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {837D9E7D-D0CC-4924-85B5-916FC5D931BA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {837D9E7D-D0CC-4924-85B5-916FC5D931BA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {837D9E7D-D0CC-4924-85B5-916FC5D931BA}.Release|Any CPU.Build.0 = Release|Any CPU + {DDF51396-4EE1-45AF-B134-CA1C56B0CD9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDF51396-4EE1-45AF-B134-CA1C56B0CD9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDF51396-4EE1-45AF-B134-CA1C56B0CD9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDF51396-4EE1-45AF-B134-CA1C56B0CD9F}.Release|Any CPU.Build.0 = Release|Any CPU + {667844E5-6D11-474D-A18F-BC4784626F34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {667844E5-6D11-474D-A18F-BC4784626F34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {667844E5-6D11-474D-A18F-BC4784626F34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {667844E5-6D11-474D-A18F-BC4784626F34}.Release|Any CPU.Build.0 = Release|Any CPU + {7F67AE85-60DC-42EC-9231-51694390ECE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F67AE85-60DC-42EC-9231-51694390ECE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F67AE85-60DC-42EC-9231-51694390ECE4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F67AE85-60DC-42EC-9231-51694390ECE4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/BuildRevisionCounter/BuildRevisionCounter.csproj b/BuildRevisionCounter/BuildRevisionCounter.csproj index 596f9ab..7a2fe99 100644 --- a/BuildRevisionCounter/BuildRevisionCounter.csproj +++ b/BuildRevisionCounter/BuildRevisionCounter.csproj @@ -116,14 +116,13 @@ - + + Designer + - - - @@ -136,6 +135,19 @@ Designer + + + {667844e5-6d11-474d-a18f-bc4784626f34} + BuildRevisionCounter.Contract + + + {ddf51396-4ee1-45af-b134-ca1c56b0cd9f} + BuildRevisionCounter.Core + + + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/BuildRevisionCounter/Controllers/CounterController.cs b/BuildRevisionCounter/Controllers/CounterController.cs index ae9e355..a85fa7b 100644 --- a/BuildRevisionCounter/Controllers/CounterController.cs +++ b/BuildRevisionCounter/Controllers/CounterController.cs @@ -1,7 +1,8 @@ -using System; +using System.Configuration; using System.Collections.Generic; -using System.Net; using System.Threading.Tasks; +using BuildRevisionCounter.Core.Repositories.Impl; +using System.Net; using System.Web.Http; using BuildRevisionCounter.Interfaces; using BuildRevisionCounter.Model; @@ -14,19 +15,6 @@ namespace BuildRevisionCounter.Controllers [BasicAuthentication] public class CounterController : ApiController { - private readonly IMongoDBStorage _mongoDbStorage; - - /// - /// Конструктор контроллера номеров ревизий. - /// - /// Объект для получения данных из БД Монго. - public CounterController(IMongoDBStorage mongoDbStorage) - { - if (mongoDbStorage == null) - throw new ArgumentNullException("mongoDbStorage"); - - _mongoDbStorage = mongoDbStorage; - } [HttpGet] [Route("")] diff --git a/BuildRevisionCounter/Model/RevisionModel.cs b/BuildRevisionCounter/Model/RevisionModel.cs deleted file mode 100644 index 96adbbd..0000000 --- a/BuildRevisionCounter/Model/RevisionModel.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MongoDB.Bson.Serialization.Attributes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace BuildRevisionCounter.Model -{ - public class RevisionModel - { - [BsonId] - public string Id; - - [BsonElement("created"), BsonDateTimeOptions(Kind=DateTimeKind.Utc)] - public DateTime Created; - - [BsonElement("updated"), BsonDateTimeOptions(Kind = DateTimeKind.Utc)] - public DateTime Updated; - - [BsonElement("currentNumber")] - public long CurrentNumber; - - } -} \ No newline at end of file diff --git a/BuildRevisionCounter/MongoDBStorage.cs b/BuildRevisionCounter/MongoDBStorage.cs deleted file mode 100644 index f5d9c84..0000000 --- a/BuildRevisionCounter/MongoDBStorage.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Threading.Tasks; -using BuildRevisionCounter.Interfaces; -using BuildRevisionCounter.Model; -using MongoDB.Driver; - -namespace BuildRevisionCounter -{ - public class MongoDBStorage : IMongoDBStorage - { - public static readonly string AdminName = "admin"; - public static readonly string AdminPassword = "admin"; - public static readonly string[] AdminRoles = {"admin", "buildserver", "editor"}; - - public IMongoCollection Revisions { get; private set; } - public IMongoCollection Users { get; private set; } - - public MongoDBStorage(IMongoDatabase database) - { - Revisions = database.GetCollection("revisions"); - Users = database.GetCollection("users"); - - Task.Run(() => SetUp()).Wait(); - } - - public async Task SetUp() - { - await EnsureUsersIndex(); - await EnsureAdminUser(); - } - - public async Task EnsureUsersIndex() - { - await Users.Indexes.CreateOneAsync( - Builders.IndexKeys.Ascending(u => u.Name), - new CreateIndexOptions { Unique = true, }); - } - - public async Task EnsureAdminUser() - { - if (await Users.CountAsync(_ => true) == 0) - { - await CreateUser(AdminName, AdminPassword, AdminRoles); - } - } - - public async Task FindUser(string name) - { - return await Users.Find(u => u.Name == name).SingleOrDefaultAsync(); - } - - public Task CreateUser(string name, string password, string[] roles) - { - return Users - .InsertOneAsync( - new UserModel - { - Name = name, - Password = password, - Roles = roles - }); - } - } -} \ No newline at end of file diff --git a/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs b/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs index 44235b9..0590e1d 100644 --- a/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs +++ b/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs @@ -1,8 +1,127 @@ using System; +using System.Configuration; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Security.Principal; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Web.Http.Filters; +using BuildRevisionCounter.Core; +using BuildRevisionCounter.Core.Repositories.Impl; +using MongoDB.Driver.Builders; namespace BuildRevisionCounter.Security { public class BasicAuthenticationAttribute : Attribute { + private const string AuthorizationScheme = "Basic"; + + private static readonly IPrincipal _anonymousPrincipal = new GenericPrincipal(new GenericIdentity("anonymous"), new[] { "anonymous" }); + + // The currently approved HTTP 1.1 specification says characters here are ISO-8859-1. + // However, the current draft updated specification for HTTP 1.1 indicates this encoding is infrequently + // used in practice and defines behavior only for ASCII. + private static readonly Encoding _asciiEncodingWithExceptionFallback = + Encoding.GetEncoding(Encoding.ASCII.CodePage, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); + + static BasicAuthenticationAttribute() + { + } + + public bool AllowMultiple { get { return false; } } + + public string Realm { get; set; } + + public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) + { + HttpRequestMessage request = context.Request; + AuthenticationHeaderValue authorization = request.Headers.Authorization; + + if (authorization == null || authorization.Scheme != AuthorizationScheme) + { + context.Principal = _anonymousPrincipal; + return Task.FromResult(0); + } + + string user; + string password; + + if (!ExtractUserNameAndPassword(authorization.Parameter, out user, out password)) + { + context.ErrorResult = new AuthenticationFailureResult("Invalid credentials", request); + return Task.FromResult(0); + } + + context.Principal = Authenticate(user, password).Result; + + if (context.Principal == null) + context.ErrorResult = new AuthenticationFailureResult("Invalid username or password", request); + + return Task.FromResult(0); + } + + private async Task Authenticate(string userName, string password) + { + var repository = new UserRepository(); + + IPrincipal principal = null; + var user = await repository.GetUserByNameAsync(userName); + if (user != null && user.Password == password) + { + principal = new GenericPrincipal(new GenericIdentity(userName), user.Roles); + } + return principal; + } + + private static bool ExtractUserNameAndPassword(string authorizationParameter, out string user, out string password) + { + user = null; + password = null; + + if (string.IsNullOrWhiteSpace(authorizationParameter)) + return false; + + byte[] credentialBytes; + + try + { + credentialBytes = Convert.FromBase64String(authorizationParameter); + } + catch (FormatException) + { + return false; + } + + string decodedCredentials; + + try + { + decodedCredentials = _asciiEncodingWithExceptionFallback.GetString(credentialBytes); + } + catch (DecoderFallbackException) + { + return false; + } + + if (String.IsNullOrEmpty(decodedCredentials)) + return false; + + var colonIndex = decodedCredentials.IndexOf(':'); + + if (colonIndex == -1) + return false; + + user = decodedCredentials.Substring(0, colonIndex); + password = decodedCredentials.Substring(colonIndex + 1); + return true; + } + + public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) + { + var authHeader = new AuthenticationHeaderValue(AuthorizationScheme, "realm=\"" + (Realm ?? "default") + "\""); // TODO: экранировать кавычки + context.Result = new AddChallengeOnUnauthorizedResult(authHeader, context.Result); + return Task.FromResult(0); + } } } \ No newline at end of file diff --git a/BuildRevisionCounter/Web.config b/BuildRevisionCounter/Web.config index 210bf89..3e5060f 100644 --- a/BuildRevisionCounter/Web.config +++ b/BuildRevisionCounter/Web.config @@ -1,5 +1,8 @@  + + + From cff375d859c192654124511ba01aafa197acf819 Mon Sep 17 00:00:00 2001 From: mnsasha Date: Sat, 9 May 2015 19:54:47 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Properties/AssemblyInfo.cs | 8 +- BuildRevisionCounter.Contract/Revision.cs | 8 +- BuildRevisionCounter.Contract/User.cs | 16 +- .../App.config | 5 +- ...visionCounter.Core.Test.Integration.csproj | 21 +- .../Properties/AssemblyInfo.cs | 8 +- .../RevisionRepositoryTest.cs | 202 +++++++++--------- .../packages.config | 6 +- .../BuildRevisionCounter.Core.csproj | 28 +-- .../Converters/RevisionConverter.cs | 32 ++- .../Converters/UserConverter.cs | 28 +-- .../DomainObjects/Revision.cs | 22 +- BuildRevisionCounter.Core/MongoDBStorage.cs | 89 ++++---- .../Properties/AssemblyInfo.cs | 8 +- .../Repositories/IRevisionRepository.cs | 10 +- .../Repositories/IUserRepository.cs | 11 +- .../Repositories/Impl/RevisionRepository.cs | 92 ++++---- .../Repositories/Impl/UserRepository.cs | 30 +-- .../RepositoryFactory.cs | 41 ++++ BuildRevisionCounter.Core/packages.config | 6 +- .../BuildRevisionCounter.csproj | 2 +- .../Controllers/CounterController.cs | 2 +- .../PublishProfiles/ToFileSystem.pubxml | 16 +- .../Security/BasicAuthenticationAttribute.cs | 26 +-- BuildRevisionCounter/Startup.cs | 2 +- BuildRevisionCounter/Web.config | 49 ++--- 26 files changed, 377 insertions(+), 391 deletions(-) create mode 100644 BuildRevisionCounter.Core/RepositoryFactory.cs diff --git a/BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs b/BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs index 6660509..9f8219b 100644 --- a/BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs +++ b/BuildRevisionCounter.Contract/Properties/AssemblyInfo.cs @@ -24,10 +24,10 @@ // Version information for an assembly consists of the following four values: // -// Major Version -// Minor Version -// Build Number -// Revision +// Major Version +// Minor Version +// Build Number +// Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: diff --git a/BuildRevisionCounter.Contract/Revision.cs b/BuildRevisionCounter.Contract/Revision.cs index e9aa232..61a52fa 100644 --- a/BuildRevisionCounter.Contract/Revision.cs +++ b/BuildRevisionCounter.Contract/Revision.cs @@ -4,12 +4,12 @@ namespace BuildRevisionCounter.Contract { public class Revision { - public string Id { get; set; } - + public string Id { get; set; } + public DateTime Created { get; set; } - public DateTime Updated { get; set; } + public DateTime Updated { get; set; } - public long NextNumber { get; set; } + public long NextNumber { get; set; } } } \ No newline at end of file diff --git a/BuildRevisionCounter.Contract/User.cs b/BuildRevisionCounter.Contract/User.cs index 307da7d..1502cac 100644 --- a/BuildRevisionCounter.Contract/User.cs +++ b/BuildRevisionCounter.Contract/User.cs @@ -1,11 +1,11 @@ namespace BuildRevisionCounter.Contract { - public class User - { - public string Name { get; set; } - - public string Password { get; set; } - - public string[] Roles { get; set; } - } + public class User + { + public string Name { get; set; } + + public string Password { get; set; } + + public string[] Roles { get; set; } + } } \ No newline at end of file diff --git a/BuildRevisionCounter.Core.Test.Integration/App.config b/BuildRevisionCounter.Core.Test.Integration/App.config index 516137f..1f0b842 100644 --- a/BuildRevisionCounter.Core.Test.Integration/App.config +++ b/BuildRevisionCounter.Core.Test.Integration/App.config @@ -1,9 +1,6 @@  - - - - + \ No newline at end of file diff --git a/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj b/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj index 6db8249..1781b39 100644 --- a/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj +++ b/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj @@ -36,23 +36,18 @@ 4 - - ..\packages\MongoDB.Bson.2.0.0\lib\net45\MongoDB.Bson.dll + + ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Bson.dll True - - ..\packages\MongoDB.Driver.2.0.0\lib\net45\MongoDB.Driver.dll + + ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Driver.dll True - - ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll + + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll True - - ..\packages\mongocsharpdriver.2.0.0\lib\net45\MongoDB.Driver.Legacy.dll - True - - @@ -82,7 +77,9 @@ Designer - + + Designer + diff --git a/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs b/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs index 700c461..06701fe 100644 --- a/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs +++ b/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs @@ -24,10 +24,10 @@ // Version information for an assembly consists of the following four values: // -// Major Version -// Minor Version -// Build Number -// Revision +// Major Version +// Minor Version +// Build Number +// Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: diff --git a/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs b/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs index 30699b4..13b7a2d 100644 --- a/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs +++ b/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs @@ -1,106 +1,106 @@ -using System.Threading.Tasks; -using BuildRevisionCounter.Core.DomainObjects; -using BuildRevisionCounter.Core.Repositories.Impl; -using MongoDB.Driver; +using BuildRevisionCounter.Core.DomainObjects; +using MongoDB.Driver.Builders; using NUnit.Framework; +using BuildRevisionCounter.Core.Repositories; namespace BuildRevisionCounter.Core.Test.Integration { - [TestFixture] - public class RevisionRepositoryTest - { - private RevisionTestHelper _dbHelper; - private RevisionRepository _repository; - - [TestFixtureSetUp] - public void ClassSetUp() - { - _dbHelper = new RevisionTestHelper(); - _repository = new RevisionRepository(); - } - - [SetUp] - public void TestSetUp() - { - _dbHelper.ClearRevisionCollectionAsync().Wait(); - } - - [Test] - public async void GetRevisionByIdAsync_WhenIdNotExists_ReturnNull() - { - // Act - var revision = await _repository.GetRevisionByIdAsync("unknownRev"); - - // Assert - Assert.IsNull(revision); - } - - [Test] - public async void GetRevisionByIdAsync_WhenIdExists_ReturnRevision() - { - // Arrange - const string expectedRevId = "testRev"; - var expectedRev = new Revision { Id = expectedRevId }; - await _dbHelper.AddRevisionAsync(expectedRev); - - // Act - var actualRev = await _repository.GetRevisionByIdAsync(expectedRevId); - var actualRevId = actualRev.Id; - - // Asert - Assert.AreEqual(expectedRevId, actualRevId); - } - - [Test] - public async void IncrementRevisionAsync_WhenNotExist_CreateWithNumberOne() - { - // Arrange - const int expectedNextNumber = 1; - const string revId = "testRev"; - - // Act - var newRevision = await _repository.IncrementRevisionAsync(revId); - var actualNextNumber = newRevision.NextNumber; - - // Assert - Assert.AreEqual(expectedNextNumber, actualNextNumber); - } - - [Test] - public async void IncrementRevisionAsync_WhenExist_IncrementNumber() - { - // Arrange - const string revId = "testRev"; - const int expectedNextNumber = 4; - var expectedRev = new Revision { Id = revId, NextNumber = expectedNextNumber - 1 }; - await _dbHelper.AddRevisionAsync(expectedRev); - - // Act - var actualRev = await _repository.IncrementRevisionAsync(revId); - var actualNextNumber = actualRev.NextNumber; - - // Assert - Assert.AreEqual(expectedNextNumber, actualNextNumber); - } - } - - internal sealed class RevisionTestHelper - { - private readonly MongoContext _storage; - - internal RevisionTestHelper() - { - _storage = MongoContext.Instance; - } - - internal async Task AddRevisionAsync(Revision revision) - { - await _storage.Revisions.InsertOneAsync(revision); - } - - internal async Task ClearRevisionCollectionAsync() - { - await _storage.Revisions.DeleteManyAsync(l => true); - } - } + [TestFixture] + public class RevisionRepositoryTest + { + private RevisionTestHelper _dbHelper; + private IRevisionRepository _repository; + + [TestFixtureSetUp] + public void ClassSetUp() + { + _dbHelper = new RevisionTestHelper(); + _repository = RepositoryFactory.Instance.GetRevisionRepository(); + } + + [SetUp] + public void TestSetUp() + { + _dbHelper.ClearRevisionCollection(); + } + + [Test] + public void GetRevisionByIdAsync_WhenIdNotExists_ReturnNull() + { + // Act + var revision = _repository.GetRevisionById("unknownRev"); + + // Assert + Assert.IsNull(revision); + } + + [Test] + public void GetRevisionByIdAsync_WhenIdExists_ReturnRevision() + { + // Arrange + const string expectedRevId = "testRev"; + var expectedRev = new Revision {Id = expectedRevId}; + _dbHelper.AddRevision(expectedRev); + + // Act + var actualRev = _repository.GetRevisionById(expectedRevId); + var actualRevId = actualRev.Id; + + // Asert + Assert.AreEqual(expectedRevId, actualRevId); + } + + [Test] + public void IncrementRevisionAsync_WhenNotExist_CreateWithNumberOne() + { + // Arrange + const int expectedNextNumber = 1; + const string revId = "testRev"; + + // Act + var newRevision = _repository.IncrementRevision(revId); + var actualNextNumber = newRevision.NextNumber; + + // Assert + Assert.AreEqual(expectedNextNumber, actualNextNumber); + } + + [Test] + public void IncrementRevisionAsync_WhenExist_IncrementNumber() + { + // Arrange + const string revId = "testRev"; + const int expectedNextNumber = 4; + var expectedRev = new Revision {Id = revId, NextNumber = expectedNextNumber - 1}; + _dbHelper.AddRevision(expectedRev); + + // Act + var actualRev = _repository.IncrementRevision(revId); + var actualNextNumber = actualRev.NextNumber; + + // Assert + Assert.AreEqual(expectedNextNumber, actualNextNumber); + } + } + + internal sealed class RevisionTestHelper + { + private readonly MongoContext _storage; + + internal RevisionTestHelper() + { + _storage = MongoContext.Instance; + } + + internal void AddRevision(Revision revision) + { + _storage.Revisions.Insert(revision); + } + + internal void ClearRevisionCollection() + { + var q = Query.Where(l => true); + _storage.Revisions.Remove(q); + } + } } diff --git a/BuildRevisionCounter.Core.Test.Integration/packages.config b/BuildRevisionCounter.Core.Test.Integration/packages.config index c276a7f..5aa9263 100644 --- a/BuildRevisionCounter.Core.Test.Integration/packages.config +++ b/BuildRevisionCounter.Core.Test.Integration/packages.config @@ -1,7 +1,5 @@  - - - - + + \ No newline at end of file diff --git a/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj b/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj index 3523acb..45678e1 100644 --- a/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj +++ b/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj @@ -31,29 +31,11 @@ 4 - - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll - True + + ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Bson.dll - - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll - True - - - ..\packages\MongoDB.Bson.2.0.0\lib\net45\MongoDB.Bson.dll - True - - - ..\packages\MongoDB.Driver.2.0.0\lib\net45\MongoDB.Driver.dll - True - - - ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll - True - - - ..\packages\mongocsharpdriver.2.0.0\lib\net45\MongoDB.Driver.Legacy.dll - True + + ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Driver.dll @@ -75,6 +57,7 @@ + @@ -87,7 +70,6 @@ - - FileSystem - Release - Any CPU - - True - True - $(MSBuildThisFileDirectory)..\..\..\publish - True +FileSystem +Release +Any CPU + +True +True +$(MSBuildThisFileDirectory)..\..\..\publish +True \ No newline at end of file diff --git a/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs b/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs index 0590e1d..fb9b3c0 100644 --- a/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs +++ b/BuildRevisionCounter/Security/BasicAuthenticationAttribute.cs @@ -1,5 +1,4 @@ using System; -using System.Configuration; using System.Net.Http; using System.Net.Http.Headers; using System.Security.Principal; @@ -8,8 +7,6 @@ using System.Threading.Tasks; using System.Web.Http.Filters; using BuildRevisionCounter.Core; -using BuildRevisionCounter.Core.Repositories.Impl; -using MongoDB.Driver.Builders; namespace BuildRevisionCounter.Security { @@ -17,19 +14,23 @@ public class BasicAuthenticationAttribute : Attribute { private const string AuthorizationScheme = "Basic"; - private static readonly IPrincipal _anonymousPrincipal = new GenericPrincipal(new GenericIdentity("anonymous"), new[] { "anonymous" }); + private static readonly IPrincipal _anonymousPrincipal = new GenericPrincipal(new GenericIdentity("anonymous"), + new[] {"anonymous"}); // The currently approved HTTP 1.1 specification says characters here are ISO-8859-1. // However, the current draft updated specification for HTTP 1.1 indicates this encoding is infrequently // used in practice and defines behavior only for ASCII. private static readonly Encoding _asciiEncodingWithExceptionFallback = Encoding.GetEncoding(Encoding.ASCII.CodePage, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); - + static BasicAuthenticationAttribute() { } - public bool AllowMultiple { get { return false; } } + public bool AllowMultiple + { + get { return false; } + } public string Realm { get; set; } @@ -52,8 +53,8 @@ public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationTok context.ErrorResult = new AuthenticationFailureResult("Invalid credentials", request); return Task.FromResult(0); } - - context.Principal = Authenticate(user, password).Result; + + context.Principal = Authenticate(user, password); if (context.Principal == null) context.ErrorResult = new AuthenticationFailureResult("Invalid username or password", request); @@ -61,12 +62,12 @@ public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationTok return Task.FromResult(0); } - private async Task Authenticate(string userName, string password) + private IPrincipal Authenticate(string userName, string password) { - var repository = new UserRepository(); + var repository = RepositoryFactory.Instance.GetUserRepository(); IPrincipal principal = null; - var user = await repository.GetUserByNameAsync(userName); + var user = repository.GetUserByName(userName); if (user != null && user.Password == password) { principal = new GenericPrincipal(new GenericIdentity(userName), user.Roles); @@ -119,7 +120,8 @@ private static bool ExtractUserNameAndPassword(string authorizationParameter, ou public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { - var authHeader = new AuthenticationHeaderValue(AuthorizationScheme, "realm=\"" + (Realm ?? "default") + "\""); // TODO: экранировать кавычки + var authHeader = new AuthenticationHeaderValue(AuthorizationScheme, "realm=\"" + (Realm ?? "default") + "\""); + // TODO: экранировать кавычки context.Result = new AddChallengeOnUnauthorizedResult(authHeader, context.Result); return Task.FromResult(0); } diff --git a/BuildRevisionCounter/Startup.cs b/BuildRevisionCounter/Startup.cs index fc77cfa..6f5c002 100644 --- a/BuildRevisionCounter/Startup.cs +++ b/BuildRevisionCounter/Startup.cs @@ -24,7 +24,7 @@ public void Configuration(IAppBuilder app) var config = new HttpConfiguration(); config.Formatters.Clear(); - config.Formatters.Add(new JsonMediaTypeFormatter()); + config.Formatters.Add(new JsonMediaTypeFormatter()); config.MapHttpAttributeRoutes(); config.EnsureInitialized(); diff --git a/BuildRevisionCounter/Web.config b/BuildRevisionCounter/Web.config index 3e5060f..df16fc2 100644 --- a/BuildRevisionCounter/Web.config +++ b/BuildRevisionCounter/Web.config @@ -1,29 +1,26 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 93a4de76fc9fde6503b5afea05428c2351bc7f98 Mon Sep 17 00:00:00 2001 From: mnsasha Date: Sat, 16 May 2015 15:43:18 +0300 Subject: [PATCH 3/7] =?UTF-8?q?=D0=94=D0=BE=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D1=8B=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20internal.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BuildRevisionCounter.Core/Converters/RevisionConverter.cs | 2 +- BuildRevisionCounter.Core/Converters/UserConverter.cs | 2 +- BuildRevisionCounter.Core/DomainObjects/Revision.cs | 2 +- BuildRevisionCounter.Core/DomainObjects/User.cs | 2 +- BuildRevisionCounter.Core/MongoDBStorage.cs | 4 ++-- BuildRevisionCounter.Core/Properties/AssemblyInfo.cs | 1 + 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/BuildRevisionCounter.Core/Converters/RevisionConverter.cs b/BuildRevisionCounter.Core/Converters/RevisionConverter.cs index 0363196..3cb4448 100644 --- a/BuildRevisionCounter.Core/Converters/RevisionConverter.cs +++ b/BuildRevisionCounter.Core/Converters/RevisionConverter.cs @@ -4,7 +4,7 @@ namespace BuildRevisionCounter.Core.Converters { public static class RevisionConverter { - public static Contract.Revision ToContract(this Revision revision) + internal static Contract.Revision ToContract(this Revision revision) { var revisionContract = new Contract.Revision { diff --git a/BuildRevisionCounter.Core/Converters/UserConverter.cs b/BuildRevisionCounter.Core/Converters/UserConverter.cs index d56fb2a..96b9e86 100644 --- a/BuildRevisionCounter.Core/Converters/UserConverter.cs +++ b/BuildRevisionCounter.Core/Converters/UserConverter.cs @@ -4,7 +4,7 @@ namespace BuildRevisionCounter.Core.Converters { public static class UserConverter { - public static Contract.User ToContract(this User user) + internal static Contract.User ToContract(this User user) { var userContract = new Contract.User {Name = user.Name, Password = user.Password, Roles = user.Roles}; diff --git a/BuildRevisionCounter.Core/DomainObjects/Revision.cs b/BuildRevisionCounter.Core/DomainObjects/Revision.cs index cf12253..43bb3c7 100644 --- a/BuildRevisionCounter.Core/DomainObjects/Revision.cs +++ b/BuildRevisionCounter.Core/DomainObjects/Revision.cs @@ -3,7 +3,7 @@ namespace BuildRevisionCounter.Core.DomainObjects { - public class Revision + internal class Revision { [BsonId] public string Id; diff --git a/BuildRevisionCounter.Core/DomainObjects/User.cs b/BuildRevisionCounter.Core/DomainObjects/User.cs index c42289a..2b280c0 100644 --- a/BuildRevisionCounter.Core/DomainObjects/User.cs +++ b/BuildRevisionCounter.Core/DomainObjects/User.cs @@ -2,7 +2,7 @@ namespace BuildRevisionCounter.Core.DomainObjects { - public class User + internal class User { [BsonId] public string Name { get; set; } diff --git a/BuildRevisionCounter.Core/MongoDBStorage.cs b/BuildRevisionCounter.Core/MongoDBStorage.cs index 4aa45f9..713829c 100644 --- a/BuildRevisionCounter.Core/MongoDBStorage.cs +++ b/BuildRevisionCounter.Core/MongoDBStorage.cs @@ -39,8 +39,8 @@ public static MongoContext Instance } } - public readonly MongoCollection Revisions; - public readonly MongoCollection Users; + internal readonly MongoCollection Revisions; + internal readonly MongoCollection Users; private void CreateAdmin() { diff --git a/BuildRevisionCounter.Core/Properties/AssemblyInfo.cs b/BuildRevisionCounter.Core/Properties/AssemblyInfo.cs index 75632a7..a51060e 100644 --- a/BuildRevisionCounter.Core/Properties/AssemblyInfo.cs +++ b/BuildRevisionCounter.Core/Properties/AssemblyInfo.cs @@ -34,3 +34,4 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: InternalsVisibleTo("BuildRevisionCounter.Core.Test.Integration")] From 2c7755d4937fb5c92ee1803cc567f1d1a17484a6 Mon Sep 17 00:00:00 2001 From: mnsasha Date: Mon, 22 Jun 2015 02:03:52 +0300 Subject: [PATCH 4/7] =?UTF-8?q?=D0=A0=D1=83=D1=87=D0=BD=D0=BE=D0=B9=20merg?= =?UTF-8?q?e=20=D1=81=20=D0=B2=D0=B5=D1=82=D0=BA=D0=BE=D0=B9=20master=20(?= =?UTF-8?q?=D0=B4=D0=B0=D0=B2=D0=BD=D0=BE=20=D1=83=D1=88=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=BF=D0=B5=D1=80=D0=B5=D0=B4).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...j => BuildRevisionCounter.Protocol.csproj} | 4 +- BuildRevisionCounter.Contract/Revision.cs | 2 +- BuildRevisionCounter.Contract/User.cs | 2 +- .../App.config | 6 - ...visionCounter.Core.Test.Integration.csproj | 111 ---------------- .../Properties/AssemblyInfo.cs | 36 ------ .../RevisionRepositoryTest.cs | 106 --------------- .../packages.config | 5 - .../BuildRevisionCounter.Core.csproj | 34 +++-- .../Converters/IRevisionConverter.cs | 11 ++ .../Converters/IUserConverter.cs | 11 ++ .../Converters/Impl/RevisionConverter.cs | 33 +++++ .../Converters/Impl/UserConverter.cs | 21 +++ .../Converters/RevisionConverter.cs | 20 --- .../Converters/UserConverter.cs | 14 -- BuildRevisionCounter.Core/MongoDBStorage.cs | 83 ++++++++++-- .../Properties/AssemblyInfo.cs | 2 +- .../Repositories/IRevisionRepository.cs | 9 +- .../Repositories/IUserRepository.cs | 8 +- .../Repositories/Impl/RevisionRepository.cs | 81 +++++++++--- .../Repositories/Impl/UserRepository.cs | 46 ++++++- .../RepositoryFactory.cs | 10 +- BuildRevisionCounter.Core/packages.config | 5 +- BuildRevisionCounter.Tests/App.config | 2 +- .../BuildRevisionCounter.Tests.csproj | 15 ++- .../Controllers/CounterControllerTest.cs | 13 +- .../Repositories/RevisionRepositoryTest.cs | 73 +++++++++++ BuildRevisionCounter.sln | 24 ++-- ...roj => BuildRevisionCounter.WebApi.csproj} | 10 +- .../Controllers/CounterController.cs | 18 +-- .../Security/BasicAuthenticationAttribute.cs | 121 ------------------ .../Security/BasicAuthenticationFilter.cs | 27 +--- BuildRevisionCounter/Startup.cs | 16 +-- 33 files changed, 426 insertions(+), 553 deletions(-) rename BuildRevisionCounter.Contract/{BuildRevisionCounter.Contract.csproj => BuildRevisionCounter.Protocol.csproj} (94%) delete mode 100644 BuildRevisionCounter.Core.Test.Integration/App.config delete mode 100644 BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj delete mode 100644 BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs delete mode 100644 BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs delete mode 100644 BuildRevisionCounter.Core.Test.Integration/packages.config create mode 100644 BuildRevisionCounter.Core/Converters/IRevisionConverter.cs create mode 100644 BuildRevisionCounter.Core/Converters/IUserConverter.cs create mode 100644 BuildRevisionCounter.Core/Converters/Impl/RevisionConverter.cs create mode 100644 BuildRevisionCounter.Core/Converters/Impl/UserConverter.cs delete mode 100644 BuildRevisionCounter.Core/Converters/RevisionConverter.cs delete mode 100644 BuildRevisionCounter.Core/Converters/UserConverter.cs create mode 100644 BuildRevisionCounter.Tests/Repositories/RevisionRepositoryTest.cs rename BuildRevisionCounter/{BuildRevisionCounter.csproj => BuildRevisionCounter.WebApi.csproj} (95%) diff --git a/BuildRevisionCounter.Contract/BuildRevisionCounter.Contract.csproj b/BuildRevisionCounter.Contract/BuildRevisionCounter.Protocol.csproj similarity index 94% rename from BuildRevisionCounter.Contract/BuildRevisionCounter.Contract.csproj rename to BuildRevisionCounter.Contract/BuildRevisionCounter.Protocol.csproj index 79640ea..d794d81 100644 --- a/BuildRevisionCounter.Contract/BuildRevisionCounter.Contract.csproj +++ b/BuildRevisionCounter.Contract/BuildRevisionCounter.Protocol.csproj @@ -7,8 +7,8 @@ {667844E5-6D11-474D-A18F-BC4784626F34} Library Properties - BuildRevisionCounter.Contract - BuildRevisionCounter.Contract + BuildRevisionCounter.Protocol + BuildRevisionCounter.Protocol v4.5 512 diff --git a/BuildRevisionCounter.Contract/Revision.cs b/BuildRevisionCounter.Contract/Revision.cs index 61a52fa..9b28020 100644 --- a/BuildRevisionCounter.Contract/Revision.cs +++ b/BuildRevisionCounter.Contract/Revision.cs @@ -1,6 +1,6 @@ using System; -namespace BuildRevisionCounter.Contract +namespace BuildRevisionCounter.Protocol { public class Revision { diff --git a/BuildRevisionCounter.Contract/User.cs b/BuildRevisionCounter.Contract/User.cs index 1502cac..3ba213f 100644 --- a/BuildRevisionCounter.Contract/User.cs +++ b/BuildRevisionCounter.Contract/User.cs @@ -1,4 +1,4 @@ -namespace BuildRevisionCounter.Contract +namespace BuildRevisionCounter.Protocol { public class User { diff --git a/BuildRevisionCounter.Core.Test.Integration/App.config b/BuildRevisionCounter.Core.Test.Integration/App.config deleted file mode 100644 index 1f0b842..0000000 --- a/BuildRevisionCounter.Core.Test.Integration/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj b/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj deleted file mode 100644 index 1781b39..0000000 --- a/BuildRevisionCounter.Core.Test.Integration/BuildRevisionCounter.Core.Test.Integration.csproj +++ /dev/null @@ -1,111 +0,0 @@ - - - - Debug - AnyCPU - {7F67AE85-60DC-42EC-9231-51694390ECE4} - Library - Properties - BuildRevisionCounter.Core.Test.Integration - BuildRevisionCounter.Core.Test.Integration - v4.5.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Bson.dll - True - - - ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Driver.dll - True - - - ..\packages\NUnit.2.6.4\lib\nunit.framework.dll - True - - - - - - - - - - - - - - - - - - - {667844E5-6D11-474D-A18F-BC4784626F34} - BuildRevisionCounter.Contract - - - {ddf51396-4ee1-45af-b134-ca1c56b0cd9f} - BuildRevisionCounter.Core - - - - - Designer - - - Designer - - - - - - - False - - - False - - - False - - - False - - - - - - - - \ No newline at end of file diff --git a/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs b/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs deleted file mode 100644 index 06701fe..0000000 --- a/BuildRevisionCounter.Core.Test.Integration/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BuildRevisionCounter.Core.Test.Integration")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("BuildRevisionCounter.Core.Test.Integration")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("4a25a19a-0cbd-45de-9e2d-e67ad9aa526d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs b/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs deleted file mode 100644 index 13b7a2d..0000000 --- a/BuildRevisionCounter.Core.Test.Integration/RevisionRepositoryTest.cs +++ /dev/null @@ -1,106 +0,0 @@ -using BuildRevisionCounter.Core.DomainObjects; -using MongoDB.Driver.Builders; -using NUnit.Framework; -using BuildRevisionCounter.Core.Repositories; - -namespace BuildRevisionCounter.Core.Test.Integration -{ - [TestFixture] - public class RevisionRepositoryTest - { - private RevisionTestHelper _dbHelper; - private IRevisionRepository _repository; - - [TestFixtureSetUp] - public void ClassSetUp() - { - _dbHelper = new RevisionTestHelper(); - _repository = RepositoryFactory.Instance.GetRevisionRepository(); - } - - [SetUp] - public void TestSetUp() - { - _dbHelper.ClearRevisionCollection(); - } - - [Test] - public void GetRevisionByIdAsync_WhenIdNotExists_ReturnNull() - { - // Act - var revision = _repository.GetRevisionById("unknownRev"); - - // Assert - Assert.IsNull(revision); - } - - [Test] - public void GetRevisionByIdAsync_WhenIdExists_ReturnRevision() - { - // Arrange - const string expectedRevId = "testRev"; - var expectedRev = new Revision {Id = expectedRevId}; - _dbHelper.AddRevision(expectedRev); - - // Act - var actualRev = _repository.GetRevisionById(expectedRevId); - var actualRevId = actualRev.Id; - - // Asert - Assert.AreEqual(expectedRevId, actualRevId); - } - - [Test] - public void IncrementRevisionAsync_WhenNotExist_CreateWithNumberOne() - { - // Arrange - const int expectedNextNumber = 1; - const string revId = "testRev"; - - // Act - var newRevision = _repository.IncrementRevision(revId); - var actualNextNumber = newRevision.NextNumber; - - // Assert - Assert.AreEqual(expectedNextNumber, actualNextNumber); - } - - [Test] - public void IncrementRevisionAsync_WhenExist_IncrementNumber() - { - // Arrange - const string revId = "testRev"; - const int expectedNextNumber = 4; - var expectedRev = new Revision {Id = revId, NextNumber = expectedNextNumber - 1}; - _dbHelper.AddRevision(expectedRev); - - // Act - var actualRev = _repository.IncrementRevision(revId); - var actualNextNumber = actualRev.NextNumber; - - // Assert - Assert.AreEqual(expectedNextNumber, actualNextNumber); - } - } - - internal sealed class RevisionTestHelper - { - private readonly MongoContext _storage; - - internal RevisionTestHelper() - { - _storage = MongoContext.Instance; - } - - internal void AddRevision(Revision revision) - { - _storage.Revisions.Insert(revision); - } - - internal void ClearRevisionCollection() - { - var q = Query.Where(l => true); - _storage.Revisions.Remove(q); - } - } -} diff --git a/BuildRevisionCounter.Core.Test.Integration/packages.config b/BuildRevisionCounter.Core.Test.Integration/packages.config deleted file mode 100644 index 5aa9263..0000000 --- a/BuildRevisionCounter.Core.Test.Integration/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj b/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj index 45678e1..99d5b9e 100644 --- a/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj +++ b/BuildRevisionCounter.Core/BuildRevisionCounter.Core.csproj @@ -31,11 +31,21 @@ 4 - - ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Bson.dll + + ..\packages\MongoDB.Bson.2.0.0\lib\net45\MongoDB.Bson.dll + True - - ..\packages\mongocsharpdriver.1.10.0\lib\net35\MongoDB.Driver.dll + + ..\packages\MongoDB.Driver.2.0.0\lib\net45\MongoDB.Driver.dll + True + + + ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll + True + + + ..\packages\mongocsharpdriver.2.0.0\lib\net45\MongoDB.Driver.Legacy.dll + True @@ -47,11 +57,13 @@ - + + + - + @@ -60,14 +72,14 @@ - - - - + {667844e5-6d11-474d-a18f-bc4784626f34} - BuildRevisionCounter.Contract + BuildRevisionCounter.Protocol + + +