From 0a49571438333b0d0812c4b194328bb3b48ac404 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 22:14:43 +0000 Subject: [PATCH 01/24] Upgraded to 4.6.1 and added Flurl and Microsoft Packages --- .../SlackConnector.Tests.Integration.csproj | 6 +- .../app.config | 24 ++++++-- .../packages.config | 4 +- .../SlackConnector.Tests.Unit.csproj | 59 +++++++++++++++++-- src/SlackConnector.Tests.Unit/app.config | 14 ++++- src/SlackConnector.Tests.Unit/packages.config | 35 +++++++---- src/SlackConnector/SlackConnector.csproj | 59 +++++++++++++++++-- src/SlackConnector/app.config | 27 +++++++-- src/SlackConnector/packages.config | 21 ++++++- 9 files changed, 214 insertions(+), 35 deletions(-) diff --git a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj index b6c3926..10cf864 100644 --- a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj +++ b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj @@ -9,7 +9,7 @@ Properties SlackConnector.Tests.Integration SlackConnector.Tests.Integration - v4.6 + v4.6.1 512 @@ -32,8 +32,8 @@ 4 - - ..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True diff --git a/src/SlackConnector.Tests.Integration/app.config b/src/SlackConnector.Tests.Integration/app.config index 1eb16eb..4e0f0c8 100644 --- a/src/SlackConnector.Tests.Integration/app.config +++ b/src/SlackConnector.Tests.Integration/app.config @@ -1,11 +1,27 @@ - + - - + + + + + + + + + + + + + + + + + + - + diff --git a/src/SlackConnector.Tests.Integration/packages.config b/src/SlackConnector.Tests.Integration/packages.config index d53d77b..e4b8e6a 100644 --- a/src/SlackConnector.Tests.Integration/packages.config +++ b/src/SlackConnector.Tests.Integration/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index a849d5b..b1f4ae3 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -9,7 +9,7 @@ Properties SlackConnector.Tests.Unit SlackConnector.Tests.Unit - v4.6 + v4.6.1 512 @@ -36,12 +36,24 @@ ..\..\packages\ExpectedObjects.1.2.3\lib\net40\ExpectedObjects.dll True + + ..\..\packages\Flurl.2.2.1\lib\netstandard1.4\Flurl.dll + True + + + ..\..\packages\Flurl.Http.1.1.1\lib\net45\Flurl.Http.dll + True + + + ..\..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll + True + ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll True - - ..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True @@ -90,11 +102,50 @@ + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + ..\..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + True + + + ..\..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + ..\..\packages\System.Net.Http.4.1.0\lib\net46\System.Net.Http.dll + True + + + ..\..\packages\System.Reflection.TypeExtensions.4.1.0\lib\net46\System.Reflection.TypeExtensions.dll + True + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + + + ..\..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + True + - diff --git a/src/SlackConnector.Tests.Unit/app.config b/src/SlackConnector.Tests.Unit/app.config index 89f8eb0..17e277f 100644 --- a/src/SlackConnector.Tests.Unit/app.config +++ b/src/SlackConnector.Tests.Unit/app.config @@ -6,6 +6,18 @@ + + + + + + + + + + + + - + diff --git a/src/SlackConnector.Tests.Unit/packages.config b/src/SlackConnector.Tests.Unit/packages.config index 0ca52ea..3fb2b5d 100644 --- a/src/SlackConnector.Tests.Unit/packages.config +++ b/src/SlackConnector.Tests.Unit/packages.config @@ -1,13 +1,28 @@  - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index cf23445..7caa8a5 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -9,7 +9,7 @@ Properties SlackConnector SlackConnector - v4.6 + v4.6.1 512 @@ -32,8 +32,20 @@ 4 - - ..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Flurl.2.2.1\lib\netstandard1.4\Flurl.dll + True + + + ..\..\packages\Flurl.Http.1.1.1\lib\net45\Flurl.Http.dll + True + + + ..\..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll + True + + + ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True @@ -42,12 +54,51 @@ + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + ..\..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll + True + + + ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + ..\..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll + True + + + ..\..\packages\System.Reflection.TypeExtensions.4.3.0\lib\net46\System.Reflection.TypeExtensions.dll + True + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + + + ..\..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll + True + - ..\..\packages\websocket-sharp-with-proxy-support.1.9.1\lib\net35-client\websocket-sharp-with-proxy-support.dll diff --git a/src/SlackConnector/app.config b/src/SlackConnector/app.config index 1eb16eb..b23487d 100644 --- a/src/SlackConnector/app.config +++ b/src/SlackConnector/app.config @@ -1,11 +1,30 @@ - + - - + + + + + + + + + + + + + + + + + + - + + + + diff --git a/src/SlackConnector/packages.config b/src/SlackConnector/packages.config index 9f721e7..0e43973 100644 --- a/src/SlackConnector/packages.config +++ b/src/SlackConnector/packages.config @@ -1,6 +1,21 @@  - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file From a3356d500321c9d79f4eaab976a087e276da4354 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:11:45 +0000 Subject: [PATCH 02/24] Oh deary me --- .../Clients/FlurlHandshakeClientTests.cs | 28 ++++++++ .../SlackConnector.Tests.Integration.csproj | 34 +++++++++- .../app.config | 4 +- .../packages.config | 8 +++ .../Connections/Clients/ChannelClientTests.cs | 16 ++--- .../Connections/Clients/ChatClientTests.cs | 30 ++++----- .../Connections/Clients/FileClientTests.cs | 36 +++++----- .../Clients/FlurlHandshakeClientTests.cs | 67 +++++++++++++++++++ .../Clients/RequestExecutorTests.cs | 4 +- ...ts.cs => RestSharpHandshakeClientTests.cs} | 20 +++--- .../SlackConnector.Tests.Unit.csproj | 23 ++++--- ...tub.cs => RestSharpRequestExecutorStub.cs} | 2 +- src/SlackConnector.Tests.Unit/app.config | 6 +- src/SlackConnector.Tests.Unit/packages.config | 14 ++-- .../Clients/Channel/ChannelClient.cs | 14 ++-- .../Connections/Clients/Chat/ChatClient.cs | 8 +-- .../Connections/Clients/ClientConstants.cs | 7 ++ .../Connections/Clients/File/FileClient.cs | 10 +-- .../Clients/Handshake/FlurlHandshakeClient.cs | 21 ++++++ ...eClient.cs => RestSharpHandshakeClient.cs} | 10 +-- ...ecutor.cs => IRestSharpRequestExecutor.cs} | 2 +- ...s => RestSharpRestSharpRequestExecutor.cs} | 6 +- .../Connections/ConnectionFactory.cs | 12 ++-- src/SlackConnector/Properties/AssemblyInfo.cs | 1 + src/SlackConnector/SlackConnector.csproj | 34 +++++----- src/SlackConnector/app.config | 4 +- src/SlackConnector/packages.config | 14 ++-- 27 files changed, 303 insertions(+), 132 deletions(-) create mode 100644 src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs create mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/FlurlHandshakeClientTests.cs rename src/SlackConnector.Tests.Unit/Connections/Clients/{HandshakeClientTests.cs => RestSharpHandshakeClientTests.cs} (64%) rename src/SlackConnector.Tests.Unit/Stubs/{RequestExecutorStub.cs => RestSharpRequestExecutorStub.cs} (86%) create mode 100644 src/SlackConnector/Connections/Clients/ClientConstants.cs create mode 100644 src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs rename src/SlackConnector/Connections/Clients/Handshake/{HandshakeClient.cs => RestSharpHandshakeClient.cs} (54%) rename src/SlackConnector/Connections/Clients/{IRequestExecutor.cs => IRestSharpRequestExecutor.cs} (78%) rename src/SlackConnector/Connections/Clients/{RequestExecutor.cs => RestSharpRestSharpRequestExecutor.cs} (70%) diff --git a/src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs b/src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs new file mode 100644 index 0000000..d395dc1 --- /dev/null +++ b/src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; +using NUnit.Framework; +using Should; +using SlackConnector.Connections.Clients.Handshake; +using SlackConnector.Connections.Responses; +using SlackConnector.Tests.Integration.Configuration; + +namespace SlackConnector.Tests.Integration.Connections.Clients +{ + [TestFixture] + public class FlurlHandshakeClientTests + { + [Test] + public async Task should_perform_handshake_with_flurl() + { + // given + var config = new ConfigReader().GetConfig(); + var client = new FlurlHandshakeClient(); + + // when + HandshakeResponse response = await client.FirmShake(config.Slack.ApiToken); + + // then + response.ShouldNotBeNull(); + response.WebSocketUrl.ShouldNotBeEmpty(); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj index 10cf864..21d4e92 100644 --- a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj +++ b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj @@ -32,6 +32,10 @@ 4 + + ..\..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll + True + ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True @@ -40,13 +44,40 @@ ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll True + + ..\..\packages\Should.1.1.20\lib\Should.dll + True + + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + ..\..\packages\System.Net.Http.4.1.1\lib\net46\System.Net.Http.dll + True + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + - @@ -54,6 +85,7 @@ + diff --git a/src/SlackConnector.Tests.Integration/app.config b/src/SlackConnector.Tests.Integration/app.config index 4e0f0c8..6b70d3a 100644 --- a/src/SlackConnector.Tests.Integration/app.config +++ b/src/SlackConnector.Tests.Integration/app.config @@ -12,11 +12,11 @@ - + - + diff --git a/src/SlackConnector.Tests.Integration/packages.config b/src/SlackConnector.Tests.Integration/packages.config index e4b8e6a..8ea70c4 100644 --- a/src/SlackConnector.Tests.Integration/packages.config +++ b/src/SlackConnector.Tests.Integration/packages.config @@ -1,5 +1,13 @@  + + + + + + + + \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/ChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/ChannelClientTests.cs index f024f54..50ae210 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/ChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/ChannelClientTests.cs @@ -16,14 +16,14 @@ internal class given_valid_standard_setup : SpecsFor { private string _slackKey = "super-key"; private string _user = "super-user"; - private RequestExecutorStub _requestExecutorStub; + private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; private JoinChannelResponse _executorResponse; private Channel Result { get; set; } protected override void InitializeClassUnderTest() { - _requestExecutorStub = new RequestExecutorStub(); - SUT = new ChannelClient(_requestExecutorStub); + _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); + SUT = new ChannelClient(_restSharpRequestExecutorStub); } protected override void Given() @@ -32,7 +32,7 @@ protected override void Given() { Channel = new Channel() }; - _requestExecutorStub.Execute_Value = _executorResponse; + _restSharpRequestExecutorStub.Execute_Value = _executorResponse; } protected override void When() @@ -43,7 +43,7 @@ protected override void When() [Test] public void then_should_pass_expected_key() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -53,7 +53,7 @@ public void then_should_pass_expected_key() [Test] public void then_should_pass_expected_channel() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("user")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -63,14 +63,14 @@ public void then_should_pass_expected_channel() [Test] public void then_should_access_expected_path() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Resource.ShouldEqual(ChannelClient.JOIN_DM_PATH); } [Test] public void then_should_have_2_params() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Parameters.Count.ShouldEqual(2); } diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs index 17841cc..8b52215 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs @@ -19,17 +19,17 @@ internal class given_valid_standard_setup_when_posting_message_without_attachmen private string _slackKey = "super-key"; private string _channel = "super-channel"; private string _text = "boom-jiggy-boom"; - private RequestExecutorStub _requestExecutorStub; + private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; protected override void InitializeClassUnderTest() { - _requestExecutorStub = new RequestExecutorStub(); - SUT = new ChatClient(_requestExecutorStub); + _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); + SUT = new ChatClient(_restSharpRequestExecutorStub); } protected override void Given() { - _requestExecutorStub.Execute_Value = new StandardResponse(); + _restSharpRequestExecutorStub.Execute_Value = new StandardResponse(); } protected override void When() @@ -40,7 +40,7 @@ protected override void When() [Test] public void then_should_pass_expected_key() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -50,7 +50,7 @@ public void then_should_pass_expected_key() [Test] public void then_should_pass_expected_channel() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("channel")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -60,7 +60,7 @@ public void then_should_pass_expected_channel() [Test] public void then_should_pass_expected_text() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("text")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -70,7 +70,7 @@ public void then_should_pass_expected_text() [Test] public void then_should_pass_expected_user_param() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("as_user")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -80,14 +80,14 @@ public void then_should_pass_expected_user_param() [Test] public void then_should_access_expected_path() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Resource.ShouldEqual(ChatClient.SEND_MESSAGE_PATH); } [Test] public void then_should_have_4_params() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Parameters.Count.ShouldEqual(4); } } @@ -95,12 +95,12 @@ public void then_should_have_4_params() internal class given_valid_standard_setup_when_posting_message_with_attachments : SpecsFor { private List _attachments; - private RequestExecutorStub _requestExecutorStub; + private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; protected override void InitializeClassUnderTest() { - _requestExecutorStub = new RequestExecutorStub(); - SUT = new ChatClient(_requestExecutorStub); + _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); + SUT = new ChatClient(_restSharpRequestExecutorStub); } protected override void Given() @@ -123,7 +123,7 @@ protected override void When() [Test] public void then_should_pass_expected_text() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter attachments = request.Parameters.FirstOrDefault(x => x.Name.Equals("attachments")); attachments.ShouldNotBeNull(); attachments.Type.ShouldEqual(ParameterType.GetOrPost); @@ -135,7 +135,7 @@ public void then_should_pass_expected_text() [Test] public void then_should_have_5_params() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Parameters.Count.ShouldEqual(5); } } diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs index db8528d..36a0462 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs @@ -17,12 +17,12 @@ internal class given_valid_standard_setup_when_posting_file : SpecsFor x.Name.Equals("token")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -48,7 +48,7 @@ public void then_should_pass_expected_key() [Test] public void then_should_pass_expected_channel() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("channels")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -58,21 +58,21 @@ public void then_should_pass_expected_channel() [Test] public void then_should_access_expected_path() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Resource.ShouldEqual(FileClient.FILE_UPLOAD_PATH); } [Test] public void then_should_have_3_params() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Parameters.Count.ShouldEqual(3); } [Test] public void then_should_pass_expected_filename() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("filename")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -82,7 +82,7 @@ public void then_should_pass_expected_filename() [Test] public void then_should_pass_expected_file() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; FileParameter file = request.Files.FirstOrDefault(x => x.Name.Equals("file")); file.ShouldNotBeNull(); file.ContentLength.ShouldBeGreaterThan(0); @@ -96,12 +96,12 @@ internal class given_valid_standard_setup_when_posting_stream : SpecsFor x.Name.Equals("token")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -131,7 +131,7 @@ public void then_should_pass_expected_key() [Test] public void then_should_pass_expected_channel() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("channels")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -141,21 +141,21 @@ public void then_should_pass_expected_channel() [Test] public void then_should_access_expected_path() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Resource.ShouldEqual(FileClient.FILE_UPLOAD_PATH); } [Test] public void then_should_have_3_params() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; request.Parameters.Count.ShouldEqual(3); } [Test] public void then_should_pass_expected_filename() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("filename")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -165,7 +165,7 @@ public void then_should_pass_expected_filename() [Test] public void then_should_pass_expected_file() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; FileParameter file = request.Files.FirstOrDefault(x => x.Name.Equals("file")); file.ShouldNotBeNull(); file.ContentLength.ShouldBeGreaterThan(0); diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/FlurlHandshakeClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/FlurlHandshakeClientTests.cs new file mode 100644 index 0000000..df96ccb --- /dev/null +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/FlurlHandshakeClientTests.cs @@ -0,0 +1,67 @@ +using System.Threading.Tasks; +using ExpectedObjects; +using Flurl; +using Flurl.Http.Testing; +using Moq; +using NUnit.Framework; +using SlackConnector.Connections.Clients; +using SlackConnector.Connections.Clients.Handshake; +using SlackConnector.Connections.Responses; + +namespace SlackConnector.Tests.Unit.Connections.Clients +{ + [TestFixture] + public class FlurlHandshakeClientTests + { + private HttpTest _httpTest; + + [SetUp] + public void Setup() + { + _httpTest = new HttpTest(); + } + + [TearDown] + public void TearDown() + { + _httpTest.Dispose(); + } + + [Test] + public async Task should_call_expected_url_with_given_slack_key() + { + // given + const string slackKey = "I-is-da-key-yeah"; + _httpTest.RespondWithJson(new HandshakeResponse()); + var client = new FlurlHandshakeClient(); + + // when + await client.FirmShake(slackKey); + + // then + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlHandshakeClient.HANDSHAKE_PATH)) + .WithQueryParamValue("token", slackKey) + .Times(1); + } + + [Test] + public async Task should_return_expected_data() + { + // given + var expectedResponse = new HandshakeResponse + { + Ok = true, + WebSocketUrl = "some-url" + }; + _httpTest.RespondWithJson(expectedResponse); + var client = new FlurlHandshakeClient(); + + // when + var result = await client.FirmShake(It.IsAny()); + + // then + result.ToExpectedObject().ShouldEqual(expectedResponse); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs index 000e0d9..2a3c418 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs @@ -11,7 +11,7 @@ namespace SlackConnector.Tests.Unit.Connections.Clients { public static class RequestExecutorTests { - internal class given_request_when_executing : SpecsFor + internal class given_request_when_executing : SpecsFor { private IRestRequest _request; private IRestResponse _response; @@ -24,7 +24,7 @@ protected override void Given() _response = new RestResponse(); GetMockFor() - .Setup(x => x.CreateClient(RequestExecutor.SLACK_URL)) + .Setup(x => x.CreateClient(RestSharpRestSharpRequestExecutor.SLACK_URL)) .Returns(GetMockFor().Object); GetMockFor() diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/HandshakeClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpHandshakeClientTests.cs similarity index 64% rename from src/SlackConnector.Tests.Unit/Connections/Clients/HandshakeClientTests.cs rename to src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpHandshakeClientTests.cs index 7c4898a..d7f5430 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/HandshakeClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpHandshakeClientTests.cs @@ -9,23 +9,23 @@ namespace SlackConnector.Tests.Unit.Connections.Clients { - public static class HandshakeClientTests + public static class RestSharpHandshakeClientTests { - internal class given_valid_response_when_handshaking_with_slack : SpecsFor + internal class given_valid_response_when_handshaking_with_slack : SpecsFor { private const string SLACK_KEY = "something_that_looks_like_a_key"; - private RequestExecutorStub _requestExecutorStub; + private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; private HandshakeResponse Result { get; set; } protected override void InitializeClassUnderTest() { - _requestExecutorStub = new RequestExecutorStub(); - SUT = new HandshakeClient(_requestExecutorStub); + _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); + SUT = new RestSharpHandshakeClient(_restSharpRequestExecutorStub); } protected override void Given() { - _requestExecutorStub.Execute_Value = new HandshakeResponse(); + _restSharpRequestExecutorStub.Execute_Value = new HandshakeResponse(); } protected override void When() @@ -36,7 +36,7 @@ protected override void When() [Test] public void then_should_pass_expected_key() { - IRestRequest request = _requestExecutorStub.Execute_Request; + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); keyParam.ShouldNotBeNull(); keyParam.Type.ShouldEqual(ParameterType.GetOrPost); @@ -46,14 +46,14 @@ public void then_should_pass_expected_key() [Test] public void then_should_access_expected_path() { - IRestRequest request = _requestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(HandshakeClient.HANDSHAKE_PATH); + IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; + request.Resource.ShouldEqual(RestSharpHandshakeClient.HANDSHAKE_PATH); } [Test] public void then_should_return_expected_model() { - Result.ShouldEqual(_requestExecutorStub.Execute_Value); + Result.ShouldEqual(_restSharpRequestExecutorStub.Execute_Value); } } } diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index b1f4ae3..4ea1bca 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -106,20 +106,20 @@ ..\..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll True - - ..\..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + + ..\..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll True - - ..\..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + + ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll True - - ..\..\packages\System.Net.Http.4.1.0\lib\net46\System.Net.Http.dll + + ..\..\packages\System.Net.Http.4.1.1\lib\net46\System.Net.Http.dll True - ..\..\packages\System.Reflection.TypeExtensions.4.1.0\lib\net46\System.Reflection.TypeExtensions.dll + ..\..\packages\System.Reflection.TypeExtensions.4.3.0\lib\net46\System.Reflection.TypeExtensions.dll True @@ -138,8 +138,8 @@ ..\..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll True - - ..\..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + + ..\..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll True @@ -152,7 +152,8 @@ - + + @@ -179,7 +180,7 @@ - + diff --git a/src/SlackConnector.Tests.Unit/Stubs/RequestExecutorStub.cs b/src/SlackConnector.Tests.Unit/Stubs/RestSharpRequestExecutorStub.cs similarity index 86% rename from src/SlackConnector.Tests.Unit/Stubs/RequestExecutorStub.cs rename to src/SlackConnector.Tests.Unit/Stubs/RestSharpRequestExecutorStub.cs index efd6f68..49b2ee8 100644 --- a/src/SlackConnector.Tests.Unit/Stubs/RequestExecutorStub.cs +++ b/src/SlackConnector.Tests.Unit/Stubs/RestSharpRequestExecutorStub.cs @@ -5,7 +5,7 @@ namespace SlackConnector.Tests.Unit.Stubs { - internal class RequestExecutorStub : IRequestExecutor + internal class RestSharpRequestExecutorStub : IRestSharpRequestExecutor { public IRestRequest Execute_Request { get; private set; } public StandardResponse Execute_Value { get; set; } diff --git a/src/SlackConnector.Tests.Unit/app.config b/src/SlackConnector.Tests.Unit/app.config index 17e277f..1fb74ad 100644 --- a/src/SlackConnector.Tests.Unit/app.config +++ b/src/SlackConnector.Tests.Unit/app.config @@ -16,7 +16,11 @@ - + + + + + diff --git a/src/SlackConnector.Tests.Unit/packages.config b/src/SlackConnector.Tests.Unit/packages.config index 3fb2b5d..a32ce7e 100644 --- a/src/SlackConnector.Tests.Unit/packages.config +++ b/src/SlackConnector.Tests.Unit/packages.config @@ -14,15 +14,15 @@ - - - - - - + + + + + + - + \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Channel/ChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/ChannelClient.cs index f74394b..5070d3e 100644 --- a/src/SlackConnector/Connections/Clients/Channel/ChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/ChannelClient.cs @@ -11,11 +11,11 @@ internal class ChannelClient : IChannelClient internal const string CHANNELS_LIST_PATH = "/api/channels.list"; internal const string GROUPS_LIST_PATH = "/api/groups.list"; internal const string USERS_LIST_PATH = "/api/users.list"; - private readonly IRequestExecutor _requestExecutor; + private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; - public ChannelClient(IRequestExecutor requestExecutor) + public ChannelClient(IRestSharpRequestExecutor restSharpRequestExecutor) { - _requestExecutor = requestExecutor; + _restSharpRequestExecutor = restSharpRequestExecutor; } public async Task JoinDirectMessageChannel(string slackKey, string user) @@ -24,7 +24,7 @@ public ChannelClient(IRequestExecutor requestExecutor) request.AddParameter("token", slackKey); request.AddParameter("user", user); - var response = await _requestExecutor.Execute(request); + var response = await _restSharpRequestExecutor.Execute(request); return response.Channel; } @@ -33,7 +33,7 @@ public ChannelClient(IRequestExecutor requestExecutor) var request = new RestRequest(CHANNELS_LIST_PATH); request.AddParameter("token", slackKey); - var response = await _requestExecutor.Execute(request); + var response = await _restSharpRequestExecutor.Execute(request); return response.Channels; } @@ -42,7 +42,7 @@ public ChannelClient(IRequestExecutor requestExecutor) var request = new RestRequest(GROUPS_LIST_PATH); request.AddParameter("token", slackKey); - var response = await _requestExecutor.Execute(request); + var response = await _restSharpRequestExecutor.Execute(request); return response.Groups; } @@ -52,7 +52,7 @@ public async Task GetUsers(string slackKey) request.AddParameter("token", slackKey); request.AddParameter("presence", "1"); - var response = await _requestExecutor.Execute(request); + var response = await _restSharpRequestExecutor.Execute(request); return response.Members; } } diff --git a/src/SlackConnector/Connections/Clients/Chat/ChatClient.cs b/src/SlackConnector/Connections/Clients/Chat/ChatClient.cs index 03c146e..126c11f 100644 --- a/src/SlackConnector/Connections/Clients/Chat/ChatClient.cs +++ b/src/SlackConnector/Connections/Clients/Chat/ChatClient.cs @@ -10,12 +10,12 @@ namespace SlackConnector.Connections.Clients.Chat { internal class ChatClient : IChatClient { - private readonly IRequestExecutor _requestExecutor; + private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; internal const string SEND_MESSAGE_PATH = "/api/chat.postMessage"; - public ChatClient(IRequestExecutor requestExecutor) + public ChatClient(IRestSharpRequestExecutor restSharpRequestExecutor) { - _requestExecutor = requestExecutor; + _restSharpRequestExecutor = restSharpRequestExecutor; } public async Task PostMessage(string slackKey, string channel, string text, IList attachments) @@ -31,7 +31,7 @@ public async Task PostMessage(string slackKey, string channel, string text, ILis request.AddParameter("attachments", JsonConvert.SerializeObject(attachments)); } - await _requestExecutor.Execute(request); + await _restSharpRequestExecutor.Execute(request); } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/ClientConstants.cs b/src/SlackConnector/Connections/Clients/ClientConstants.cs new file mode 100644 index 0000000..c1f247e --- /dev/null +++ b/src/SlackConnector/Connections/Clients/ClientConstants.cs @@ -0,0 +1,7 @@ +namespace SlackConnector.Connections.Clients +{ + internal static class ClientConstants + { + internal const string HANDSHAKE_PATH = "https://slack.com"; + } +} \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/File/FileClient.cs b/src/SlackConnector/Connections/Clients/File/FileClient.cs index 1484b66..44f137b 100644 --- a/src/SlackConnector/Connections/Clients/File/FileClient.cs +++ b/src/SlackConnector/Connections/Clients/File/FileClient.cs @@ -7,12 +7,12 @@ namespace SlackConnector.Connections.Clients.File { internal class FileClient : IFileClient { - private readonly IRequestExecutor _requestExecutor; + private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; internal const string FILE_UPLOAD_PATH = "/api/files.upload"; - public FileClient(IRequestExecutor requestExecutor) + public FileClient(IRestSharpRequestExecutor restSharpRequestExecutor) { - _requestExecutor = requestExecutor; + _restSharpRequestExecutor = restSharpRequestExecutor; } public async Task PostFile(string slackKey, string channel, string file) @@ -23,7 +23,7 @@ public async Task PostFile(string slackKey, string channel, string file) request.AddParameter("filename", Path.GetFileName(file)); request.AddFile("file", file); - await _requestExecutor.Execute(request); + await _restSharpRequestExecutor.Execute(request); } public async Task PostFile(string slackKey, string channel, Stream stream, string fileName) @@ -36,7 +36,7 @@ public async Task PostFile(string slackKey, string channel, Stream stream, strin byte[] data = await ReadByteArray(stream); request.AddFile("file", data, fileName); - await _requestExecutor.Execute(request); + await _restSharpRequestExecutor.Execute(request); } private async Task ReadByteArray(Stream stream) diff --git a/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs b/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs new file mode 100644 index 0000000..3d0a4d0 --- /dev/null +++ b/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; +using SlackConnector.Connections.Responses; + +namespace SlackConnector.Connections.Clients.Handshake +{ + internal class FlurlHandshakeClient : IHandshakeClient + { + internal const string HANDSHAKE_PATH = "/api/rtm.start"; + + public async Task FirmShake(string slackKey) + { + return await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(HANDSHAKE_PATH) + .SetQueryParam("token", slackKey) + .GetJsonAsync(); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Handshake/HandshakeClient.cs b/src/SlackConnector/Connections/Clients/Handshake/RestSharpHandshakeClient.cs similarity index 54% rename from src/SlackConnector/Connections/Clients/Handshake/HandshakeClient.cs rename to src/SlackConnector/Connections/Clients/Handshake/RestSharpHandshakeClient.cs index a7e767f..c052d56 100644 --- a/src/SlackConnector/Connections/Clients/Handshake/HandshakeClient.cs +++ b/src/SlackConnector/Connections/Clients/Handshake/RestSharpHandshakeClient.cs @@ -4,14 +4,14 @@ namespace SlackConnector.Connections.Clients.Handshake { - internal class HandshakeClient : IHandshakeClient + internal class RestSharpHandshakeClient : IHandshakeClient { - private readonly IRequestExecutor _requestExecutor; + private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; internal const string HANDSHAKE_PATH = "/api/rtm.start"; - public HandshakeClient(IRequestExecutor requestExecutor) + public RestSharpHandshakeClient(IRestSharpRequestExecutor restSharpRequestExecutor) { - _requestExecutor = requestExecutor; + _restSharpRequestExecutor = restSharpRequestExecutor; } public async Task FirmShake(string slackKey) @@ -19,7 +19,7 @@ public async Task FirmShake(string slackKey) var request = new RestRequest(HANDSHAKE_PATH); request.AddParameter("token", slackKey); - return await _requestExecutor.Execute(request); + return await _restSharpRequestExecutor.Execute(request); } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/IRequestExecutor.cs b/src/SlackConnector/Connections/Clients/IRestSharpRequestExecutor.cs similarity index 78% rename from src/SlackConnector/Connections/Clients/IRequestExecutor.cs rename to src/SlackConnector/Connections/Clients/IRestSharpRequestExecutor.cs index ec8e2eb..6b86aba 100644 --- a/src/SlackConnector/Connections/Clients/IRequestExecutor.cs +++ b/src/SlackConnector/Connections/Clients/IRestSharpRequestExecutor.cs @@ -3,7 +3,7 @@ namespace SlackConnector.Connections.Clients { - internal interface IRequestExecutor + internal interface IRestSharpRequestExecutor { Task Execute(IRestRequest request) where T : class; } diff --git a/src/SlackConnector/Connections/Clients/RequestExecutor.cs b/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs similarity index 70% rename from src/SlackConnector/Connections/Clients/RequestExecutor.cs rename to src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs index f5c96f1..ff7832e 100644 --- a/src/SlackConnector/Connections/Clients/RequestExecutor.cs +++ b/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs @@ -3,14 +3,14 @@ namespace SlackConnector.Connections.Clients { - internal class RequestExecutor : IRequestExecutor + internal class RestSharpRestSharpRequestExecutor : IRestSharpRequestExecutor { - internal const string SLACK_URL = "https://slack.com"; + internal static string SLACK_URL => ClientConstants.HANDSHAKE_PATH; private readonly IRestSharpFactory _restSharpFactory; private readonly IResponseVerifier _responseVerifier; - public RequestExecutor(IRestSharpFactory restSharpFactory, IResponseVerifier responseVerifier) + public RestSharpRestSharpRequestExecutor(IRestSharpFactory restSharpFactory, IResponseVerifier responseVerifier) { _restSharpFactory = restSharpFactory; _responseVerifier = responseVerifier; diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index c8704fe..3d583e7 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -11,13 +11,13 @@ namespace SlackConnector.Connections { internal class ConnectionFactory : IConnectionFactory { - private readonly IRequestExecutor _requestExecutor; + private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; public ConnectionFactory() { IRestSharpFactory restSharpFactory = new RestSharpFactory(); IResponseVerifier responseVerifier = new ResponseVerifier(); - _requestExecutor = new RequestExecutor(restSharpFactory, responseVerifier); + _restSharpRequestExecutor = new RestSharpRestSharpRequestExecutor(restSharpFactory, responseVerifier); } public IWebSocketClient CreateWebSocketClient(string url, ProxySettings proxySettings) @@ -27,22 +27,22 @@ public IWebSocketClient CreateWebSocketClient(string url, ProxySettings proxySet public IHandshakeClient CreateHandshakeClient() { - return new HandshakeClient(_requestExecutor); + return new RestSharpHandshakeClient(_restSharpRequestExecutor); } public IChatClient CreateChatClient() { - return new ChatClient(_requestExecutor); + return new ChatClient(_restSharpRequestExecutor); } public IFileClient CreateFileClient() { - return new FileClient(_requestExecutor); + return new FileClient(_restSharpRequestExecutor); } public IChannelClient CreateChannelClient() { - return new ChannelClient(_requestExecutor); + return new ChannelClient(_restSharpRequestExecutor); } } } \ No newline at end of file diff --git a/src/SlackConnector/Properties/AssemblyInfo.cs b/src/SlackConnector/Properties/AssemblyInfo.cs index 9572157..0cac20e 100644 --- a/src/SlackConnector/Properties/AssemblyInfo.cs +++ b/src/SlackConnector/Properties/AssemblyInfo.cs @@ -36,4 +36,5 @@ [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: InternalsVisibleTo("SlackConnector.Tests.Unit")] +[assembly: InternalsVisibleTo("SlackConnector.Tests.Integration")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index 7caa8a5..b73f459 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -40,8 +40,8 @@ ..\..\packages\Flurl.Http.1.1.1\lib\net45\Flurl.Http.dll True - - ..\..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll + + ..\..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll True @@ -54,8 +54,8 @@ - - ..\..\packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll True @@ -66,8 +66,8 @@ ..\..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll True - - ..\..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll + + ..\..\packages\System.Net.Http.4.1.1\lib\net46\System.Net.Http.dll True @@ -76,19 +76,19 @@ - ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + ..\..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll True - - ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + ..\..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll True - - ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + ..\..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll True - - ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll True @@ -110,12 +110,14 @@ + - - + + + - + diff --git a/src/SlackConnector/app.config b/src/SlackConnector/app.config index b23487d..2543591 100644 --- a/src/SlackConnector/app.config +++ b/src/SlackConnector/app.config @@ -12,11 +12,11 @@ - + - + diff --git a/src/SlackConnector/packages.config b/src/SlackConnector/packages.config index 0e43973..abc48b1 100644 --- a/src/SlackConnector/packages.config +++ b/src/SlackConnector/packages.config @@ -2,20 +2,20 @@ - + - + - + - - - - + + + + \ No newline at end of file From 93ad568b4780ba152bc75f6d01e9fd054717c7e5 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:14:42 +0000 Subject: [PATCH 03/24] Simply changed project targets --- .../SlackConnector.Tests.Integration.csproj | 2 +- src/SlackConnector.Tests.Integration/app.config | 2 +- .../SlackConnector.Tests.Unit.csproj | 2 +- src/SlackConnector.Tests.Unit/app.config | 8 ++++---- src/SlackConnector/SlackConnector.csproj | 2 +- src/SlackConnector/app.config | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj index b6c3926..e6a4b43 100644 --- a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj +++ b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj @@ -9,7 +9,7 @@ Properties SlackConnector.Tests.Integration SlackConnector.Tests.Integration - v4.6 + v4.6.1 512 diff --git a/src/SlackConnector.Tests.Integration/app.config b/src/SlackConnector.Tests.Integration/app.config index 1eb16eb..9f9c5da 100644 --- a/src/SlackConnector.Tests.Integration/app.config +++ b/src/SlackConnector.Tests.Integration/app.config @@ -8,4 +8,4 @@ - + diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index a849d5b..f89f3d2 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -9,7 +9,7 @@ Properties SlackConnector.Tests.Unit SlackConnector.Tests.Unit - v4.6 + v4.6.1 512 diff --git a/src/SlackConnector.Tests.Unit/app.config b/src/SlackConnector.Tests.Unit/app.config index 89f8eb0..cad638a 100644 --- a/src/SlackConnector.Tests.Unit/app.config +++ b/src/SlackConnector.Tests.Unit/app.config @@ -1,11 +1,11 @@ - + - - + + - + diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index cf23445..fbaf9bf 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -9,7 +9,7 @@ Properties SlackConnector SlackConnector - v4.6 + v4.6.1 512 diff --git a/src/SlackConnector/app.config b/src/SlackConnector/app.config index 1eb16eb..9f9c5da 100644 --- a/src/SlackConnector/app.config +++ b/src/SlackConnector/app.config @@ -8,4 +8,4 @@ - + From 3c90e1d9ad69b6068b5e6da61552511c52f3ba8c Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:15:33 +0000 Subject: [PATCH 04/24] Reinstalled nuget packages --- .../packages.config | 4 ++-- src/SlackConnector.Tests.Unit/app.config | 8 ++++---- src/SlackConnector.Tests.Unit/packages.config | 20 +++++++++---------- src/SlackConnector/packages.config | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/SlackConnector.Tests.Integration/packages.config b/src/SlackConnector.Tests.Integration/packages.config index d53d77b..e85b525 100644 --- a/src/SlackConnector.Tests.Integration/packages.config +++ b/src/SlackConnector.Tests.Integration/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/app.config b/src/SlackConnector.Tests.Unit/app.config index cad638a..a39959f 100644 --- a/src/SlackConnector.Tests.Unit/app.config +++ b/src/SlackConnector.Tests.Unit/app.config @@ -1,11 +1,11 @@ - + - - + + - + diff --git a/src/SlackConnector.Tests.Unit/packages.config b/src/SlackConnector.Tests.Unit/packages.config index 0ca52ea..5072066 100644 --- a/src/SlackConnector.Tests.Unit/packages.config +++ b/src/SlackConnector.Tests.Unit/packages.config @@ -1,13 +1,13 @@  - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/src/SlackConnector/packages.config b/src/SlackConnector/packages.config index 9f721e7..2cbd9cf 100644 --- a/src/SlackConnector/packages.config +++ b/src/SlackConnector/packages.config @@ -1,6 +1,6 @@  - - - + + + \ No newline at end of file From 59270264cfb80e6fc45e10dffd8e461e713a5b7b Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:17:25 +0000 Subject: [PATCH 05/24] Installed Flurl --- .../SlackConnector.Tests.Integration.csproj | 57 ++++++++++++++++++- .../app.config | 20 +++++-- .../packages.config | 17 +++++- .../SlackConnector.Tests.Unit.csproj | 57 ++++++++++++++++++- src/SlackConnector.Tests.Unit/app.config | 12 ++++ src/SlackConnector.Tests.Unit/packages.config | 17 +++++- src/SlackConnector/SlackConnector.csproj | 57 ++++++++++++++++++- src/SlackConnector/app.config | 20 +++++-- src/SlackConnector/packages.config | 17 +++++- 9 files changed, 254 insertions(+), 20 deletions(-) diff --git a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj index e6a4b43..f891c04 100644 --- a/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj +++ b/src/SlackConnector.Tests.Integration/SlackConnector.Tests.Integration.csproj @@ -32,8 +32,20 @@ 4 - - ..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Flurl.2.2.1\lib\netstandard1.4\Flurl.dll + True + + + ..\..\packages\Flurl.Http.1.1.1\lib\net45\Flurl.Http.dll + True + + + ..\..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll + True + + + ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True @@ -42,11 +54,50 @@ + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + ..\..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + True + + + ..\..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + ..\..\packages\System.Net.Http.4.1.0\lib\net46\System.Net.Http.dll + True + + + ..\..\packages\System.Reflection.TypeExtensions.4.1.0\lib\net46\System.Reflection.TypeExtensions.dll + True + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + + + ..\..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + True + - diff --git a/src/SlackConnector.Tests.Integration/app.config b/src/SlackConnector.Tests.Integration/app.config index 9f9c5da..72c1eb0 100644 --- a/src/SlackConnector.Tests.Integration/app.config +++ b/src/SlackConnector.Tests.Integration/app.config @@ -1,11 +1,23 @@ - + - - + + + + + + + + + + + + + + - + diff --git a/src/SlackConnector.Tests.Integration/packages.config b/src/SlackConnector.Tests.Integration/packages.config index e85b525..6ac7c00 100644 --- a/src/SlackConnector.Tests.Integration/packages.config +++ b/src/SlackConnector.Tests.Integration/packages.config @@ -1,5 +1,20 @@  - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index f89f3d2..b1f4ae3 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -36,12 +36,24 @@ ..\..\packages\ExpectedObjects.1.2.3\lib\net40\ExpectedObjects.dll True + + ..\..\packages\Flurl.2.2.1\lib\netstandard1.4\Flurl.dll + True + + + ..\..\packages\Flurl.Http.1.1.1\lib\net45\Flurl.Http.dll + True + + + ..\..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll + True + ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll True - - ..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True @@ -90,11 +102,50 @@ + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + ..\..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + True + + + ..\..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + ..\..\packages\System.Net.Http.4.1.0\lib\net46\System.Net.Http.dll + True + + + ..\..\packages\System.Reflection.TypeExtensions.4.1.0\lib\net46\System.Reflection.TypeExtensions.dll + True + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + + + ..\..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + True + - diff --git a/src/SlackConnector.Tests.Unit/app.config b/src/SlackConnector.Tests.Unit/app.config index a39959f..17e277f 100644 --- a/src/SlackConnector.Tests.Unit/app.config +++ b/src/SlackConnector.Tests.Unit/app.config @@ -6,6 +6,18 @@ + + + + + + + + + + + + diff --git a/src/SlackConnector.Tests.Unit/packages.config b/src/SlackConnector.Tests.Unit/packages.config index 5072066..3fb2b5d 100644 --- a/src/SlackConnector.Tests.Unit/packages.config +++ b/src/SlackConnector.Tests.Unit/packages.config @@ -1,8 +1,11 @@  + + + - + @@ -10,4 +13,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index fbaf9bf..e8c2653 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -32,8 +32,20 @@ 4 - - ..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Flurl.2.2.1\lib\netstandard1.4\Flurl.dll + True + + + ..\..\packages\Flurl.Http.1.1.1\lib\net45\Flurl.Http.dll + True + + + ..\..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll + True + + + ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True @@ -42,12 +54,51 @@ + + ..\..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + ..\..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + True + + + ..\..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + ..\..\packages\System.Net.Http.4.1.0\lib\net46\System.Net.Http.dll + True + + + ..\..\packages\System.Reflection.TypeExtensions.4.1.0\lib\net46\System.Reflection.TypeExtensions.dll + True + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + + + ..\..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + True + - ..\..\packages\websocket-sharp-with-proxy-support.1.9.1\lib\net35-client\websocket-sharp-with-proxy-support.dll diff --git a/src/SlackConnector/app.config b/src/SlackConnector/app.config index 9f9c5da..72c1eb0 100644 --- a/src/SlackConnector/app.config +++ b/src/SlackConnector/app.config @@ -1,11 +1,23 @@ - + - - + + + + + + + + + + + + + + - + diff --git a/src/SlackConnector/packages.config b/src/SlackConnector/packages.config index 2cbd9cf..adabc76 100644 --- a/src/SlackConnector/packages.config +++ b/src/SlackConnector/packages.config @@ -1,6 +1,21 @@  - + + + + + + + + + + + + + + + + \ No newline at end of file From d6425c34869f1a4f4277babdcd34ff861f579b0f Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:29:51 +0000 Subject: [PATCH 06/24] Removed RestSharp Handshake Client --- .../Clients/RestSharpHandshakeClientTests.cs | 60 ------------------- .../SlackConnector.Tests.Unit.csproj | 1 - .../Handshake/RestSharpHandshakeClient.cs | 25 -------- .../Connections/ConnectionFactory.cs | 2 +- src/SlackConnector/SlackConnector.csproj | 1 - 5 files changed, 1 insertion(+), 88 deletions(-) delete mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpHandshakeClientTests.cs delete mode 100644 src/SlackConnector/Connections/Clients/Handshake/RestSharpHandshakeClient.cs diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpHandshakeClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpHandshakeClientTests.cs deleted file mode 100644 index d7f5430..0000000 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpHandshakeClientTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Linq; -using NUnit.Framework; -using RestSharp; -using Should; -using SlackConnector.Connections.Clients.Handshake; -using SlackConnector.Connections.Responses; -using SlackConnector.Tests.Unit.Stubs; -using SpecsFor; - -namespace SlackConnector.Tests.Unit.Connections.Clients -{ - public static class RestSharpHandshakeClientTests - { - internal class given_valid_response_when_handshaking_with_slack : SpecsFor - { - private const string SLACK_KEY = "something_that_looks_like_a_key"; - private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; - private HandshakeResponse Result { get; set; } - - protected override void InitializeClassUnderTest() - { - _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new RestSharpHandshakeClient(_restSharpRequestExecutorStub); - } - - protected override void Given() - { - _restSharpRequestExecutorStub.Execute_Value = new HandshakeResponse(); - } - - protected override void When() - { - Result = SUT.FirmShake(SLACK_KEY).Result; - } - - [Test] - public void then_should_pass_expected_key() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(SLACK_KEY); - } - - [Test] - public void then_should_access_expected_path() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(RestSharpHandshakeClient.HANDSHAKE_PATH); - } - - [Test] - public void then_should_return_expected_model() - { - Result.ShouldEqual(_restSharpRequestExecutorStub.Execute_Value); - } - } - } -} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index 67b1f78..1b5dceb 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -153,7 +153,6 @@ - diff --git a/src/SlackConnector/Connections/Clients/Handshake/RestSharpHandshakeClient.cs b/src/SlackConnector/Connections/Clients/Handshake/RestSharpHandshakeClient.cs deleted file mode 100644 index c052d56..0000000 --- a/src/SlackConnector/Connections/Clients/Handshake/RestSharpHandshakeClient.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading.Tasks; -using RestSharp; -using SlackConnector.Connections.Responses; - -namespace SlackConnector.Connections.Clients.Handshake -{ - internal class RestSharpHandshakeClient : IHandshakeClient - { - private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; - internal const string HANDSHAKE_PATH = "/api/rtm.start"; - - public RestSharpHandshakeClient(IRestSharpRequestExecutor restSharpRequestExecutor) - { - _restSharpRequestExecutor = restSharpRequestExecutor; - } - - public async Task FirmShake(string slackKey) - { - var request = new RestRequest(HANDSHAKE_PATH); - request.AddParameter("token", slackKey); - - return await _restSharpRequestExecutor.Execute(request); - } - } -} \ No newline at end of file diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 3d583e7..0ebdbf1 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -27,7 +27,7 @@ public IWebSocketClient CreateWebSocketClient(string url, ProxySettings proxySet public IHandshakeClient CreateHandshakeClient() { - return new RestSharpHandshakeClient(_restSharpRequestExecutor); + return new FlurlHandshakeClient(); } public IChatClient CreateChatClient() diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index 7176596..3e46276 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -117,7 +117,6 @@ - From 4199677102e059cd1cbb4fb4045002f9fb6fe487 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:45:00 +0000 Subject: [PATCH 07/24] Added FlurlChannelClient and starting to move logic and tests over --- .../Clients/Flurl/FlurlChannelClientTests.cs | 59 +++++++++++++++++++ .../{ => Flurl}/FlurlHandshakeClientTests.cs | 2 +- ...ests.cs => RestSharpChannelClientTests.cs} | 8 +-- .../SlackConnector.Tests.Unit.csproj | 5 +- .../Clients/Channel/FlurlChannelClient.cs | 39 ++++++++++++ ...nelClient.cs => RestSharpChannelClient.cs} | 4 +- .../Connections/ConnectionFactory.cs | 2 +- src/SlackConnector/SlackConnector.csproj | 3 +- 8 files changed, 111 insertions(+), 11 deletions(-) create mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs rename src/SlackConnector.Tests.Unit/Connections/Clients/{ => Flurl}/FlurlHandshakeClientTests.cs (96%) rename src/SlackConnector.Tests.Unit/Connections/Clients/{ChannelClientTests.cs => RestSharpChannelClientTests.cs} (90%) create mode 100644 src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs rename src/SlackConnector/Connections/Clients/Channel/{ChannelClient.cs => RestSharpChannelClient.cs} (93%) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs new file mode 100644 index 0000000..e36cfe2 --- /dev/null +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs @@ -0,0 +1,59 @@ +using System.Threading.Tasks; +using ExpectedObjects; +using Flurl; +using Flurl.Http.Testing; +using NUnit.Framework; +using Should; +using SlackConnector.Connections.Clients; +using SlackConnector.Connections.Clients.Channel; +using SlackConnector.Connections.Clients.Handshake; +using SlackConnector.Connections.Models; +using SlackConnector.Connections.Responses; + +namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl +{ + [TestFixture] + public class FlurlChannelClientTests + { + private HttpTest _httpTest; + + [SetUp] + public void Setup() + { + _httpTest = new HttpTest(); + } + + [TearDown] + public void TearDown() + { + _httpTest.Dispose(); + } + + [Test] + public async Task should_call_expected_url_and_return_expected_channels() + { + // given + const string slackKey = "I-is-da-key-yeah"; + + var expectedResponse = new [] + { + new Channel { IsChannel = true, Name = "name1" }, + new Channel { IsArchived = true, Name = "name2" }, + }; + + _httpTest.RespondWithJson(expectedResponse); + var client = new FlurlChannelClient(); + + // when + var result = await client.GetChannels(slackKey); + + // then + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.CHANNELS_LIST_PATH)) + .WithQueryParamValue("token", slackKey) + .Times(1); + + result.ToExpectedObject().ShouldEqual(expectedResponse); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/FlurlHandshakeClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs similarity index 96% rename from src/SlackConnector.Tests.Unit/Connections/Clients/FlurlHandshakeClientTests.cs rename to src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs index df96ccb..17f2163 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/FlurlHandshakeClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs @@ -8,7 +8,7 @@ using SlackConnector.Connections.Clients.Handshake; using SlackConnector.Connections.Responses; -namespace SlackConnector.Tests.Unit.Connections.Clients +namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl { [TestFixture] public class FlurlHandshakeClientTests diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/ChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChannelClientTests.cs similarity index 90% rename from src/SlackConnector.Tests.Unit/Connections/Clients/ChannelClientTests.cs rename to src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChannelClientTests.cs index 50ae210..bb57978 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/ChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChannelClientTests.cs @@ -10,9 +10,9 @@ namespace SlackConnector.Tests.Unit.Connections.Clients { - public static class ChannelClientTests + public static class RestSharpChannelClientTests { - internal class given_valid_standard_setup : SpecsFor + internal class given_valid_standard_setup : SpecsFor { private string _slackKey = "super-key"; private string _user = "super-user"; @@ -23,7 +23,7 @@ internal class given_valid_standard_setup : SpecsFor protected override void InitializeClassUnderTest() { _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new ChannelClient(_restSharpRequestExecutorStub); + SUT = new RestSharpChannelClient(_restSharpRequestExecutorStub); } protected override void Given() @@ -64,7 +64,7 @@ public void then_should_pass_expected_channel() public void then_should_access_expected_path() { IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(ChannelClient.JOIN_DM_PATH); + request.Resource.ShouldEqual(RestSharpChannelClient.JOIN_DM_PATH); } [Test] diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index 1b5dceb..a317d64 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -152,8 +152,9 @@ - - + + + diff --git a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs new file mode 100644 index 0000000..d5c350b --- /dev/null +++ b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs @@ -0,0 +1,39 @@ +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; +using SlackConnector.Connections.Models; + +namespace SlackConnector.Connections.Clients.Channel +{ + internal class FlurlChannelClient : IChannelClient + { + internal const string JOIN_DM_PATH = "/api/im.open"; + internal const string CHANNELS_LIST_PATH = "/api/channels.list"; + internal const string GROUPS_LIST_PATH = "/api/groups.list"; + internal const string USERS_LIST_PATH = "/api/users.list"; + + public Task JoinDirectMessageChannel(string slackKey, string user) + { + throw new System.NotImplementedException(); + } + + public async Task GetChannels(string slackKey) + { + return await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(CHANNELS_LIST_PATH) + .SetQueryParam("token", slackKey) + .GetJsonAsync(); + } + + public Task GetGroups(string slackKey) + { + throw new System.NotImplementedException(); + } + + public Task GetUsers(string slackKey) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Channel/ChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/RestSharpChannelClient.cs similarity index 93% rename from src/SlackConnector/Connections/Clients/Channel/ChannelClient.cs rename to src/SlackConnector/Connections/Clients/Channel/RestSharpChannelClient.cs index 5070d3e..3aebe9e 100644 --- a/src/SlackConnector/Connections/Clients/Channel/ChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/RestSharpChannelClient.cs @@ -5,7 +5,7 @@ namespace SlackConnector.Connections.Clients.Channel { - internal class ChannelClient : IChannelClient + internal class RestSharpChannelClient : IChannelClient { internal const string JOIN_DM_PATH = "/api/im.open"; internal const string CHANNELS_LIST_PATH = "/api/channels.list"; @@ -13,7 +13,7 @@ internal class ChannelClient : IChannelClient internal const string USERS_LIST_PATH = "/api/users.list"; private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; - public ChannelClient(IRestSharpRequestExecutor restSharpRequestExecutor) + public RestSharpChannelClient(IRestSharpRequestExecutor restSharpRequestExecutor) { _restSharpRequestExecutor = restSharpRequestExecutor; } diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 0ebdbf1..09c4f26 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -42,7 +42,7 @@ public IFileClient CreateFileClient() public IChannelClient CreateChannelClient() { - return new ChannelClient(_restSharpRequestExecutor); + return new RestSharpChannelClient(_restSharpRequestExecutor); } } } \ No newline at end of file diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index 3e46276..596da4b 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -110,6 +110,7 @@ + @@ -118,7 +119,7 @@ - + From aa7dbe72e157224b388b69c8f75826433946114d Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:47:43 +0000 Subject: [PATCH 08/24] Moved group over --- .../Clients/Flurl/FlurlChannelClientTests.cs | 32 ++++++++++++++++--- .../Clients/Channel/FlurlChannelClient.cs | 8 +++-- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs index e36cfe2..bd1b154 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs @@ -3,12 +3,9 @@ using Flurl; using Flurl.Http.Testing; using NUnit.Framework; -using Should; using SlackConnector.Connections.Clients; using SlackConnector.Connections.Clients.Channel; -using SlackConnector.Connections.Clients.Handshake; using SlackConnector.Connections.Models; -using SlackConnector.Connections.Responses; namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl { @@ -35,7 +32,7 @@ public async Task should_call_expected_url_and_return_expected_channels() // given const string slackKey = "I-is-da-key-yeah"; - var expectedResponse = new [] + var expectedResponse = new[] { new Channel { IsChannel = true, Name = "name1" }, new Channel { IsArchived = true, Name = "name2" }, @@ -55,5 +52,32 @@ public async Task should_call_expected_url_and_return_expected_channels() result.ToExpectedObject().ShouldEqual(expectedResponse); } + + [Test] + public async Task should_call_expected_url_and_return_expected_groups() + { + // given + const string slackKey = "I-is-another-key"; + + var expectedResponse = new[] + { + new Group { IsGroup = true, Name = "name1" }, + new Group { IsOpen = true, Name = "name2" } + }; + + _httpTest.RespondWithJson(expectedResponse); + var client = new FlurlChannelClient(); + + // when + var result = await client.GetGroups(slackKey); + + // then + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.GROUPS_LIST_PATH)) + .WithQueryParamValue("token", slackKey) + .Times(1); + + result.ToExpectedObject().ShouldEqual(expectedResponse); + } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs index d5c350b..aa8bc38 100644 --- a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs @@ -26,9 +26,13 @@ internal class FlurlChannelClient : IChannelClient .GetJsonAsync(); } - public Task GetGroups(string slackKey) + public async Task GetGroups(string slackKey) { - throw new System.NotImplementedException(); + return await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(GROUPS_LIST_PATH) + .SetQueryParam("token", slackKey) + .GetJsonAsync(); } public Task GetUsers(string slackKey) From d712f4dd661b6ac93b21b08ba746658d90909b61 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:50:15 +0000 Subject: [PATCH 09/24] Moved over List Users method --- .../Clients/Flurl/FlurlChannelClientTests.cs | 27 +++++++++++++++++++ .../Clients/Channel/FlurlChannelClient.cs | 10 ++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs index bd1b154..096c8be 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs @@ -79,5 +79,32 @@ public async Task should_call_expected_url_and_return_expected_groups() result.ToExpectedObject().ShouldEqual(expectedResponse); } + + [Test] + public async Task should_call_expected_url_and_return_expected_users() + { + // given + const string slackKey = "I-is-another-key"; + + var expectedResponse = new[] + { + new User { Id = "some-id-thing", IsBot = true }, + new User { Name = "some-id-thing", Deleted = true }, + }; + + _httpTest.RespondWithJson(expectedResponse); + var client = new FlurlChannelClient(); + + // when + var result = await client.GetUsers(slackKey); + + // then + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.USERS_LIST_PATH)) + .WithQueryParamValue("token", slackKey) + .Times(1); + + result.ToExpectedObject().ShouldEqual(expectedResponse); + } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs index aa8bc38..a1f7f73 100644 --- a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs @@ -32,12 +32,16 @@ public async Task GetGroups(string slackKey) .HANDSHAKE_PATH .AppendPathSegment(GROUPS_LIST_PATH) .SetQueryParam("token", slackKey) - .GetJsonAsync(); + .GetJsonAsync(); } - public Task GetUsers(string slackKey) + public async Task GetUsers(string slackKey) { - throw new System.NotImplementedException(); + return await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(USERS_LIST_PATH) + .SetQueryParam("token", slackKey) + .GetJsonAsync(); } } } \ No newline at end of file From 60f5079df98074e6c8d33e0be19e5f04c0aa0bca Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 24 Jan 2017 23:54:15 +0000 Subject: [PATCH 10/24] Moved over Join DM --- .../Clients/Flurl/FlurlChannelClientTests.cs | 29 +++++++++++++++++++ .../Clients/Channel/FlurlChannelClient.cs | 9 ++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs index 096c8be..c3ef753 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs @@ -106,5 +106,34 @@ public async Task should_call_expected_url_and_return_expected_users() result.ToExpectedObject().ShouldEqual(expectedResponse); } + + [Test] + public async Task should_join_direct_message_channel() + { + // given + const string slackKey = "I-is-another-key"; + const string userId = "blahdy-blah"; + + var expectedResponse = new Channel + { + Id = "some-channel", + IsChannel = true + }; + + _httpTest.RespondWithJson(expectedResponse); + var client = new FlurlChannelClient(); + + // when + var result = await client.JoinDirectMessageChannel(slackKey, userId); + + // then + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.JOIN_DM_PATH)) + .WithQueryParamValue("token", slackKey) + .WithQueryParamValue("user", userId) + .Times(1); + + result.ToExpectedObject().ShouldEqual(expectedResponse); + } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs index a1f7f73..c9315c5 100644 --- a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs @@ -12,9 +12,14 @@ internal class FlurlChannelClient : IChannelClient internal const string GROUPS_LIST_PATH = "/api/groups.list"; internal const string USERS_LIST_PATH = "/api/users.list"; - public Task JoinDirectMessageChannel(string slackKey, string user) + public async Task JoinDirectMessageChannel(string slackKey, string user) { - throw new System.NotImplementedException(); + return await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(JOIN_DM_PATH) + .SetQueryParam("token", slackKey) + .SetQueryParam("user", user) + .GetJsonAsync(); } public async Task GetChannels(string slackKey) From cdc62b1d099c2e0fba0f1214d02383ea4e7b2bce Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 00:42:28 +0000 Subject: [PATCH 11/24] Retroactively fitted error handling into flurl clients --- .../Clients/Flurl/FlurlChannelClientTests.cs | 91 +++++++++++-------- .../Clients/ResponseVerifierTests.cs | 29 +++++- .../SlackConnector.Tests.Unit.csproj | 1 + .../TestExtensions/ShouldExtensions.cs | 57 ++++++++++++ .../Clients/Channel/FlurlChannelClient.cs | 35 +++++-- .../Connections/Clients/IResponseVerifier.cs | 2 + .../Connections/Clients/ResponseVerifier.cs | 10 +- .../Connections/ConnectionFactory.cs | 2 +- 8 files changed, 180 insertions(+), 47 deletions(-) create mode 100644 src/SlackConnector.Tests.Unit/TestExtensions/ShouldExtensions.cs diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs index c3ef753..3dfebda 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs @@ -2,10 +2,13 @@ using ExpectedObjects; using Flurl; using Flurl.Http.Testing; +using Moq; using NUnit.Framework; using SlackConnector.Connections.Clients; using SlackConnector.Connections.Clients.Channel; using SlackConnector.Connections.Models; +using SlackConnector.Connections.Responses; +using SlackConnector.Tests.Unit.TestExtensions; namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl { @@ -13,11 +16,15 @@ namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl public class FlurlChannelClientTests { private HttpTest _httpTest; + private Mock _responseVerifierMock; + private FlurlChannelClient _channelClient; [SetUp] public void Setup() { _httpTest = new HttpTest(); + _responseVerifierMock = new Mock(); + _channelClient = new FlurlChannelClient(_responseVerifierMock.Object); } [TearDown] @@ -27,113 +34,125 @@ public void TearDown() } [Test] - public async Task should_call_expected_url_and_return_expected_channels() + public async Task should_join_direct_message_channel() { // given - const string slackKey = "I-is-da-key-yeah"; + const string slackKey = "I-is-another-key"; + const string userId = "blahdy-blah"; - var expectedResponse = new[] + var expectedResponse = new JoinChannelResponse { - new Channel { IsChannel = true, Name = "name1" }, - new Channel { IsArchived = true, Name = "name2" }, + Channel = new Channel + { + Id = "some-channel", + IsChannel = true + } }; _httpTest.RespondWithJson(expectedResponse); - var client = new FlurlChannelClient(); // when - var result = await client.GetChannels(slackKey); + var result = await _channelClient.JoinDirectMessageChannel(slackKey, userId); // then + _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.CHANNELS_LIST_PATH)) + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.JOIN_DM_PATH)) .WithQueryParamValue("token", slackKey) + .WithQueryParamValue("user", userId) .Times(1); - result.ToExpectedObject().ShouldEqual(expectedResponse); + result.ToExpectedObject().ShouldEqual(expectedResponse.Channel); } [Test] - public async Task should_call_expected_url_and_return_expected_groups() + public async Task should_call_expected_url_and_return_expected_channels() { // given - const string slackKey = "I-is-another-key"; + const string slackKey = "I-is-da-key-yeah"; - var expectedResponse = new[] + var expectedResponse = new ChannelsResponse { - new Group { IsGroup = true, Name = "name1" }, - new Group { IsOpen = true, Name = "name2" } + Channels = new[] + { + new Channel { IsChannel = true, Name = "name1" }, + new Channel { IsArchived = true, Name = "name2" }, + } }; _httpTest.RespondWithJson(expectedResponse); - var client = new FlurlChannelClient(); // when - var result = await client.GetGroups(slackKey); + var result = await _channelClient.GetChannels(slackKey); // then + _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.GROUPS_LIST_PATH)) + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.CHANNELS_LIST_PATH)) .WithQueryParamValue("token", slackKey) .Times(1); - result.ToExpectedObject().ShouldEqual(expectedResponse); + result.ToExpectedObject().ShouldEqual(expectedResponse.Channels); } [Test] - public async Task should_call_expected_url_and_return_expected_users() + public async Task should_call_expected_url_and_return_expected_groups() { // given const string slackKey = "I-is-another-key"; - var expectedResponse = new[] + var expectedResponse = new GroupsResponse { - new User { Id = "some-id-thing", IsBot = true }, - new User { Name = "some-id-thing", Deleted = true }, + Groups = new[] + { + new Group { IsGroup = true, Name = "name1" }, + new Group { IsOpen = true, Name = "name2" } + } }; _httpTest.RespondWithJson(expectedResponse); - var client = new FlurlChannelClient(); // when - var result = await client.GetUsers(slackKey); + var result = await _channelClient.GetGroups(slackKey); // then + _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.USERS_LIST_PATH)) + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.GROUPS_LIST_PATH)) .WithQueryParamValue("token", slackKey) .Times(1); - result.ToExpectedObject().ShouldEqual(expectedResponse); + result.ToExpectedObject().ShouldEqual(expectedResponse.Groups); } [Test] - public async Task should_join_direct_message_channel() + public async Task should_call_expected_url_and_return_expected_users() { // given const string slackKey = "I-is-another-key"; - const string userId = "blahdy-blah"; - var expectedResponse = new Channel + var expectedResponse = new UsersResponse { - Id = "some-channel", - IsChannel = true + Members = new[] + { + new User { Id = "some-id-thing", IsBot = true }, + new User { Name = "some-id-thing", Deleted = true }, + } }; _httpTest.RespondWithJson(expectedResponse); - var client = new FlurlChannelClient(); // when - var result = await client.JoinDirectMessageChannel(slackKey, userId); + var result = await _channelClient.GetUsers(slackKey); // then + _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.JOIN_DM_PATH)) + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.USERS_LIST_PATH)) .WithQueryParamValue("token", slackKey) - .WithQueryParamValue("user", userId) .Times(1); - result.ToExpectedObject().ShouldEqual(expectedResponse); + result.ToExpectedObject().ShouldEqual(expectedResponse.Members); } } } \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs index bf623b6..8106e45 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs @@ -104,7 +104,7 @@ public void then_should_throw_expected_exception() { exception = ex; } - + exception.ShouldNotBeNull(); exception.Message.ShouldEqual("Error occured while posting message 'test error'"); } @@ -254,5 +254,32 @@ private class ExampleModel : StandardResponse { public string Value { get; set; } } + + [TestFixture] + public class ResponseVerifierTests2 + { + [Test] + public void should_throw_exception_with_given_error_message_when_request_failed() + { + // given + var response = new StandardResponse { Ok = false, Error = "I AM A ERROR-message" }; + var verifier = new ResponseVerifier(); + + // when && then + var exception = Assert.Throws(() => verifier.VerifyResponse(response)); + exception.Message.ShouldEqual($"Error occured while posting message '{response.Error}'"); + } + + [Test] + public void should_not_throw_exception() + { + // given + var response = new StandardResponse { Ok = true }; + var verifier = new ResponseVerifier(); + + // when && then + Assert.DoesNotThrow(() => verifier.VerifyResponse(response)); + } + } } } \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index a317d64..94ec2d1 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -185,6 +185,7 @@ + diff --git a/src/SlackConnector.Tests.Unit/TestExtensions/ShouldExtensions.cs b/src/SlackConnector.Tests.Unit/TestExtensions/ShouldExtensions.cs new file mode 100644 index 0000000..dad3586 --- /dev/null +++ b/src/SlackConnector.Tests.Unit/TestExtensions/ShouldExtensions.cs @@ -0,0 +1,57 @@ +using System; +using System.Linq.Expressions; +using ExpectedObjects; +using Moq; +using SpecsFor.ShouldExtensions; + +namespace SlackConnector.Tests.Unit.TestExtensions +{ + public static class Looks + { + public static T Like(T obj) + { + var expected = obj.ToExpectedObject(); + return It.Is(t => expected.Equals(t)); + } + + public static T Like(Expression> initializer) where T : class + { + return It.Is(t => ShouldMatch(initializer, t)); + } + + + public static T LikePartialOf(object partial) + { + var expected = partial.ToExpectedObject(); + + return It.Is(t => ShouldMatch(expected, t)); + } + + private static bool ShouldMatch(Expression> initializer, T o) where T : class + { + try + { + o.ShouldLookLike(initializer); + } + catch (Exception) + { + return false; + } + + return true; + } + + private static bool ShouldMatch(ExpectedObject expected, object o) + { + try + { + expected.ShouldMatch(o); + return true; + } + catch (Exception) + { + return false; + } + } + } +} \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs index c9315c5..b1f3567 100644 --- a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs @@ -2,51 +2,70 @@ using Flurl; using Flurl.Http; using SlackConnector.Connections.Models; +using SlackConnector.Connections.Responses; namespace SlackConnector.Connections.Clients.Channel { internal class FlurlChannelClient : IChannelClient { + private readonly IResponseVerifier _responseVerifier; internal const string JOIN_DM_PATH = "/api/im.open"; internal const string CHANNELS_LIST_PATH = "/api/channels.list"; internal const string GROUPS_LIST_PATH = "/api/groups.list"; internal const string USERS_LIST_PATH = "/api/users.list"; + + public FlurlChannelClient(IResponseVerifier responseVerifier) + { + _responseVerifier = responseVerifier; + } public async Task JoinDirectMessageChannel(string slackKey, string user) { - return await ClientConstants + var response = await ClientConstants .HANDSHAKE_PATH .AppendPathSegment(JOIN_DM_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("user", user) - .GetJsonAsync(); + .GetJsonAsync(); + + _responseVerifier.VerifyResponse(response); + return response.Channel; } public async Task GetChannels(string slackKey) { - return await ClientConstants + var response = await ClientConstants .HANDSHAKE_PATH .AppendPathSegment(CHANNELS_LIST_PATH) .SetQueryParam("token", slackKey) - .GetJsonAsync(); + .GetJsonAsync(); + + _responseVerifier.VerifyResponse(response); + return response.Channels; } public async Task GetGroups(string slackKey) { - return await ClientConstants + var response = await ClientConstants .HANDSHAKE_PATH .AppendPathSegment(GROUPS_LIST_PATH) .SetQueryParam("token", slackKey) - .GetJsonAsync(); + .GetJsonAsync(); + + _responseVerifier.VerifyResponse(response); + return response.Groups; } public async Task GetUsers(string slackKey) { - return await ClientConstants + var response = await ClientConstants .HANDSHAKE_PATH .AppendPathSegment(USERS_LIST_PATH) .SetQueryParam("token", slackKey) - .GetJsonAsync(); + .GetJsonAsync(); + + _responseVerifier.VerifyResponse(response); + return response.Members; } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/IResponseVerifier.cs b/src/SlackConnector/Connections/Clients/IResponseVerifier.cs index 175cfb5..f5fabda 100644 --- a/src/SlackConnector/Connections/Clients/IResponseVerifier.cs +++ b/src/SlackConnector/Connections/Clients/IResponseVerifier.cs @@ -1,9 +1,11 @@ using RestSharp; +using SlackConnector.Connections.Responses; namespace SlackConnector.Connections.Clients { internal interface IResponseVerifier { T VerifyResponse(IRestResponse response) where T : class; + void VerifyResponse(StandardResponse response); } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/ResponseVerifier.cs b/src/SlackConnector/Connections/Clients/ResponseVerifier.cs index 8417c26..e58e080 100644 --- a/src/SlackConnector/Connections/Clients/ResponseVerifier.cs +++ b/src/SlackConnector/Connections/Clients/ResponseVerifier.cs @@ -15,7 +15,7 @@ public T VerifyResponse(IRestResponse response) where T : class throw new CommunicationException($"Error occured while sending message '{response.StatusCode}'"); } - var result = JsonConvert.DeserializeObject(response.Content, typeof (T)) as StandardResponse; + var result = JsonConvert.DeserializeObject(response.Content, typeof(T)) as StandardResponse; if (!result.Ok) { throw new CommunicationException($"Error occured while posting message '{result.Error}'"); @@ -23,5 +23,13 @@ public T VerifyResponse(IRestResponse response) where T : class return result as T; } + + public void VerifyResponse(StandardResponse response) + { + if (!response.Ok) + { + throw new CommunicationException($"Error occured while posting message '{response.Error}'"); + } + } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 09c4f26..8a7b500 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -42,7 +42,7 @@ public IFileClient CreateFileClient() public IChannelClient CreateChannelClient() { - return new RestSharpChannelClient(_restSharpRequestExecutor); + return new FlurlChannelClient(new ResponseVerifier()); } } } \ No newline at end of file From 52f938d2f638a3afb6cfdc4a165926daa4f6772d Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 00:53:09 +0000 Subject: [PATCH 12/24] Added more error checking, but looks like fluent might not be working well so might change to passing in client (user presence isn't getting detected) --- .../Clients/FlurlHandshakeClientTests.cs | 3 +- .../Flurl/FlurlHandshakeClientTests.cs | 31 ++++++++----------- .../Clients/Handshake/FlurlHandshakeClient.cs | 11 ++++++- .../Connections/ConnectionFactory.cs | 2 +- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs b/src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs index d395dc1..aa13866 100644 --- a/src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs +++ b/src/SlackConnector.Tests.Integration/Connections/Clients/FlurlHandshakeClientTests.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using NUnit.Framework; using Should; +using SlackConnector.Connections.Clients; using SlackConnector.Connections.Clients.Handshake; using SlackConnector.Connections.Responses; using SlackConnector.Tests.Integration.Configuration; @@ -15,7 +16,7 @@ public async Task should_perform_handshake_with_flurl() { // given var config = new ConfigReader().GetConfig(); - var client = new FlurlHandshakeClient(); + var client = new FlurlHandshakeClient(new ResponseVerifier()); // when HandshakeResponse response = await client.FirmShake(config.Slack.ApiToken); diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs index 17f2163..c9f80e5 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs @@ -5,8 +5,10 @@ using Moq; using NUnit.Framework; using SlackConnector.Connections.Clients; +using SlackConnector.Connections.Clients.Channel; using SlackConnector.Connections.Clients.Handshake; using SlackConnector.Connections.Responses; +using SlackConnector.Tests.Unit.TestExtensions; namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl { @@ -14,11 +16,15 @@ namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl public class FlurlHandshakeClientTests { private HttpTest _httpTest; + private Mock _responseVerifierMock; + private FlurlHandshakeClient _handshakeClient; [SetUp] public void Setup() { _httpTest = new HttpTest(); + _responseVerifierMock = new Mock(); + _handshakeClient = new FlurlHandshakeClient(_responseVerifierMock.Object); } [TearDown] @@ -32,35 +38,24 @@ public async Task should_call_expected_url_with_given_slack_key() { // given const string slackKey = "I-is-da-key-yeah"; - _httpTest.RespondWithJson(new HandshakeResponse()); - var client = new FlurlHandshakeClient(); - // when - await client.FirmShake(slackKey); - - // then - _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlHandshakeClient.HANDSHAKE_PATH)) - .WithQueryParamValue("token", slackKey) - .Times(1); - } - - [Test] - public async Task should_return_expected_data() - { - // given var expectedResponse = new HandshakeResponse { Ok = true, WebSocketUrl = "some-url" }; _httpTest.RespondWithJson(expectedResponse); - var client = new FlurlHandshakeClient(); // when - var result = await client.FirmShake(It.IsAny()); + var result = await _handshakeClient.FirmShake(slackKey); // then + _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse))); + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlHandshakeClient.HANDSHAKE_PATH)) + .WithQueryParamValue("token", slackKey) + .Times(1); + result.ToExpectedObject().ShouldEqual(expectedResponse); } } diff --git a/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs b/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs index 3d0a4d0..ed4cb0b 100644 --- a/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs +++ b/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs @@ -7,15 +7,24 @@ namespace SlackConnector.Connections.Clients.Handshake { internal class FlurlHandshakeClient : IHandshakeClient { + private readonly IResponseVerifier _responseVerifier; internal const string HANDSHAKE_PATH = "/api/rtm.start"; + public FlurlHandshakeClient(IResponseVerifier responseVerifier) + { + _responseVerifier = responseVerifier; + } + public async Task FirmShake(string slackKey) { - return await ClientConstants + var response = await ClientConstants .HANDSHAKE_PATH .AppendPathSegment(HANDSHAKE_PATH) .SetQueryParam("token", slackKey) .GetJsonAsync(); + + _responseVerifier.VerifyResponse(response); + return response; } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 8a7b500..7702f24 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -27,7 +27,7 @@ public IWebSocketClient CreateWebSocketClient(string url, ProxySettings proxySet public IHandshakeClient CreateHandshakeClient() { - return new FlurlHandshakeClient(); + return new FlurlHandshakeClient(new ResponseVerifier()); } public IChatClient CreateChatClient() From 7b6bdf4538b5303a624075450c63209942bd56b3 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 01:04:50 +0000 Subject: [PATCH 13/24] Stupid me, forgot a param --- .../Connections/Clients/Flurl/FlurlChannelClientTests.cs | 1 + .../Connections/Clients/Channel/FlurlChannelClient.cs | 1 + src/SlackConnector/Connections/ConnectionFactory.cs | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs index 3dfebda..cccfe30 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs @@ -150,6 +150,7 @@ public async Task should_call_expected_url_and_return_expected_users() _httpTest .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.USERS_LIST_PATH)) .WithQueryParamValue("token", slackKey) + .WithQueryParamValue("presence", "1") .Times(1); result.ToExpectedObject().ShouldEqual(expectedResponse.Members); diff --git a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs index b1f3567..60f68de 100644 --- a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs @@ -62,6 +62,7 @@ public async Task GetUsers(string slackKey) .HANDSHAKE_PATH .AppendPathSegment(USERS_LIST_PATH) .SetQueryParam("token", slackKey) + .SetQueryParam("presence", "1") .GetJsonAsync(); _responseVerifier.VerifyResponse(response); diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 7702f24..fc86d01 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -42,7 +42,7 @@ public IFileClient CreateFileClient() public IChannelClient CreateChannelClient() { - return new FlurlChannelClient(new ResponseVerifier()); + return new RestSharpChannelClient(_restSharpRequestExecutor);//new FlurlChannelClient(new ResponseVerifier()); } } } \ No newline at end of file From a1a71c4bcfa4c0d0f48f7e58b5361f67117a6cf7 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 01:05:48 +0000 Subject: [PATCH 14/24] Forgot to add back correct user client --- src/SlackConnector/Connections/ConnectionFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index fc86d01..7702f24 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -42,7 +42,7 @@ public IFileClient CreateFileClient() public IChannelClient CreateChannelClient() { - return new RestSharpChannelClient(_restSharpRequestExecutor);//new FlurlChannelClient(new ResponseVerifier()); + return new FlurlChannelClient(new ResponseVerifier()); } } } \ No newline at end of file From 25ef9304f89a6e230f486bbc9cfd42d67a6b176f Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 01:06:44 +0000 Subject: [PATCH 15/24] Renamed old client to be prefixed with RestSharp --- .../Connections/Clients/ChatClientTests.cs | 10 +++++----- .../Connections/Clients/FileClientTests.cs | 12 ++++++------ .../Chat/{ChatClient.cs => RestSharpChatClient.cs} | 4 ++-- .../File/{FileClient.cs => RestSharpFileClient.cs} | 4 ++-- src/SlackConnector/Connections/ConnectionFactory.cs | 4 ++-- src/SlackConnector/SlackConnector.csproj | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) rename src/SlackConnector/Connections/Clients/Chat/{ChatClient.cs => RestSharpChatClient.cs} (89%) rename src/SlackConnector/Connections/Clients/File/{FileClient.cs => RestSharpFileClient.cs} (92%) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs index 8b52215..955b23d 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs @@ -14,7 +14,7 @@ namespace SlackConnector.Tests.Unit.Connections.Clients { public static class ChatClientTests { - internal class given_valid_standard_setup_when_posting_message_without_attachments : SpecsFor + internal class given_valid_standard_setup_when_posting_message_without_attachments : SpecsFor { private string _slackKey = "super-key"; private string _channel = "super-channel"; @@ -24,7 +24,7 @@ internal class given_valid_standard_setup_when_posting_message_without_attachmen protected override void InitializeClassUnderTest() { _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new ChatClient(_restSharpRequestExecutorStub); + SUT = new RestSharpChatClient(_restSharpRequestExecutorStub); } protected override void Given() @@ -81,7 +81,7 @@ public void then_should_pass_expected_user_param() public void then_should_access_expected_path() { IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(ChatClient.SEND_MESSAGE_PATH); + request.Resource.ShouldEqual(RestSharpChatClient.SEND_MESSAGE_PATH); } [Test] @@ -92,7 +92,7 @@ public void then_should_have_4_params() } } - internal class given_valid_standard_setup_when_posting_message_with_attachments : SpecsFor + internal class given_valid_standard_setup_when_posting_message_with_attachments : SpecsFor { private List _attachments; private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; @@ -100,7 +100,7 @@ internal class given_valid_standard_setup_when_posting_message_with_attachments protected override void InitializeClassUnderTest() { _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new ChatClient(_restSharpRequestExecutorStub); + SUT = new RestSharpChatClient(_restSharpRequestExecutorStub); } protected override void Given() diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs index 36a0462..515fe0d 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs @@ -12,7 +12,7 @@ namespace SlackConnector.Tests.Unit.Connections.Clients { public static class FileClientTests { - internal class given_valid_standard_setup_when_posting_file : SpecsFor + internal class given_valid_standard_setup_when_posting_file : SpecsFor { private readonly string _slackKey = "super-key"; private readonly string _channelId = "channel-id"; @@ -22,7 +22,7 @@ internal class given_valid_standard_setup_when_posting_file : SpecsFor + internal class given_valid_standard_setup_when_posting_stream : SpecsFor { private readonly string _slackKey = "super-key"; private readonly string _channelId = "channel-id"; @@ -101,7 +101,7 @@ internal class given_valid_standard_setup_when_posting_stream : SpecsFor - + @@ -122,7 +122,7 @@ - + From 80b49f28b8bd85ab6c113e16abc19d8c7aefdb3b Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 12:06:22 +0000 Subject: [PATCH 16/24] Starting to add chat client --- .../Clients/Flurl/FlurlChatClientTests.cs | 61 +++++++++++++++++++ .../Flurl/FlurlHandshakeClientTests.cs | 1 - ...ntTests.cs => RestSharpChatClientTests.cs} | 2 +- .../SlackConnector.Tests.Unit.csproj | 3 +- .../Clients/Chat/FlurlChatClient.cs | 34 +++++++++++ src/SlackConnector/SlackConnector.csproj | 1 + 6 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs rename src/SlackConnector.Tests.Unit/Connections/Clients/{ChatClientTests.cs => RestSharpChatClientTests.cs} (99%) create mode 100644 src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs new file mode 100644 index 0000000..afb532a --- /dev/null +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs @@ -0,0 +1,61 @@ +using System.Threading.Tasks; +using ExpectedObjects; +using Flurl; +using Flurl.Http.Testing; +using Moq; +using NUnit.Framework; +using SlackConnector.Connections.Clients; +using SlackConnector.Connections.Clients.Chat; +using SlackConnector.Connections.Clients.Handshake; +using SlackConnector.Connections.Responses; +using SlackConnector.Tests.Unit.TestExtensions; + +namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl +{ + [TestFixture] + public class FlurlChatClientTests + { + private HttpTest _httpTest; + private Mock _responseVerifierMock; + private FlurlChatClient _chatClient; + + [SetUp] + public void Setup() + { + _httpTest = new HttpTest(); + _responseVerifierMock = new Mock(); + _chatClient = new FlurlChatClient(_responseVerifierMock.Object); + } + + [TearDown] + public void TearDown() + { + _httpTest.Dispose(); + } + + [Test] + public async Task should_call_expected_url_with_given_slack_key() + { + // given + const string slackKey = "something-that-looks-like-a-slack-key"; + const string channel = "channel-name"; + const string text = "some-text-for-you"; + + var expectedResponse = new StandardResponse(); + _httpTest.RespondWithJson(expectedResponse); + + // when + await _chatClient.PostMessage(slackKey, channel, text, null); + + // then + _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse))); + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChatClient.SEND_MESSAGE_PATH)) + .WithQueryParamValue("token", slackKey) + .WithQueryParamValue("channel", channel) + .WithQueryParamValue("text", text) + .WithQueryParamValue("as_user", "true") + .Times(1); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs index c9f80e5..0aa8e16 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs @@ -5,7 +5,6 @@ using Moq; using NUnit.Framework; using SlackConnector.Connections.Clients; -using SlackConnector.Connections.Clients.Channel; using SlackConnector.Connections.Clients.Handshake; using SlackConnector.Connections.Responses; using SlackConnector.Tests.Unit.TestExtensions; diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChatClientTests.cs similarity index 99% rename from src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs rename to src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChatClientTests.cs index 955b23d..0681224 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/ChatClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChatClientTests.cs @@ -12,7 +12,7 @@ namespace SlackConnector.Tests.Unit.Connections.Clients { - public static class ChatClientTests + public static class RestSharpChatClientTests { internal class given_valid_standard_setup_when_posting_message_without_attachments : SpecsFor { diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index 94ec2d1..f9c62c2 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -153,9 +153,10 @@ + - + diff --git a/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs new file mode 100644 index 0000000..5b5c7b5 --- /dev/null +++ b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; +using SlackConnector.Connections.Responses; +using SlackConnector.Models; + +namespace SlackConnector.Connections.Clients.Chat +{ + internal class FlurlChatClient : IChatClient + { + private readonly IResponseVerifier _responseVerifier; + internal const string SEND_MESSAGE_PATH = "/api/chat.postMessage"; + + public FlurlChatClient(IResponseVerifier responseVerifier) + { + _responseVerifier = responseVerifier; + } + + public async Task PostMessage(string slackKey, string channel, string text, IList attachments) + { + var response = await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(SEND_MESSAGE_PATH) + .SetQueryParam("token", slackKey) + .SetQueryParam("channel", channel) + .SetQueryParam("text", text) + .SetQueryParam("as_user", "true") + .GetJsonAsync(); + + _responseVerifier.VerifyResponse(response); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index 258f441..c212904 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -111,6 +111,7 @@ + From 271005c672cb60aec2565edbf63a5a1be8c156c1 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 12:13:53 +0000 Subject: [PATCH 17/24] Ported over ChatClient --- .../Clients/Flurl/FlurlChatClientTests.cs | 29 +++++++++++++++++-- .../Clients/Chat/FlurlChatClient.cs | 14 +++++++-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs index afb532a..2305c5b 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs @@ -1,13 +1,14 @@ -using System.Threading.Tasks; -using ExpectedObjects; +using System.Collections.Generic; +using System.Threading.Tasks; using Flurl; using Flurl.Http.Testing; using Moq; +using Newtonsoft.Json; using NUnit.Framework; using SlackConnector.Connections.Clients; using SlackConnector.Connections.Clients.Chat; -using SlackConnector.Connections.Clients.Handshake; using SlackConnector.Connections.Responses; +using SlackConnector.Models; using SlackConnector.Tests.Unit.TestExtensions; namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl @@ -55,6 +56,28 @@ public async Task should_call_expected_url_with_given_slack_key() .WithQueryParamValue("channel", channel) .WithQueryParamValue("text", text) .WithQueryParamValue("as_user", "true") + .WithoutQueryParam("attachments") + .Times(1); + } + + [Test] + public async Task should_add_attachments_if_given() + { + // given + _httpTest.RespondWithJson(new StandardResponse()); + var attachments = new List + { + new SlackAttachment { Text = "dummy text" }, + new SlackAttachment { AuthorName = "dummy author" }, + }; + + // when + await _chatClient.PostMessage(It.IsAny(), It.IsAny(), It.IsAny(), attachments); + + // then + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChatClient.SEND_MESSAGE_PATH)) + .WithQueryParamValue("attachments", JsonConvert.SerializeObject(attachments)) .Times(1); } } diff --git a/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs index 5b5c7b5..97e6e5d 100644 --- a/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs +++ b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Flurl; using Flurl.Http; +using Newtonsoft.Json; using SlackConnector.Connections.Responses; using SlackConnector.Models; @@ -19,15 +21,21 @@ public FlurlChatClient(IResponseVerifier responseVerifier) public async Task PostMessage(string slackKey, string channel, string text, IList attachments) { - var response = await ClientConstants + var request = ClientConstants .HANDSHAKE_PATH .AppendPathSegment(SEND_MESSAGE_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("channel", channel) .SetQueryParam("text", text) - .SetQueryParam("as_user", "true") - .GetJsonAsync(); + .SetQueryParam("as_user", "true"); + + if (attachments != null && attachments.Any()) + { + request.SetQueryParam("attachments", JsonConvert.SerializeObject(attachments)); + } + + var response = await request.GetJsonAsync(); _responseVerifier.VerifyResponse(response); } } From afcd5293271f0f5da26f82b57c88cfb88f29a65f Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 12:16:54 +0000 Subject: [PATCH 18/24] Plumbed in FlurlChatClient and tests passing --- src/SlackConnector.Tests.Integration/JoinDmChannelTests.cs | 2 +- src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs | 3 +-- src/SlackConnector/Connections/ConnectionFactory.cs | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/SlackConnector.Tests.Integration/JoinDmChannelTests.cs b/src/SlackConnector.Tests.Integration/JoinDmChannelTests.cs index 0031937..c7bfc26 100644 --- a/src/SlackConnector.Tests.Integration/JoinDmChannelTests.cs +++ b/src/SlackConnector.Tests.Integration/JoinDmChannelTests.cs @@ -33,7 +33,7 @@ public async Task should_join_channel() var dmChannel = connection.ConnectedDM($"@{config.Slack.TestUserName}"); Assert.That(dmChannel, Is.Not.Null); - await connection.Say(new BotMessage{ChatHub = dmChannel, Text = "Wuzzup - testing in da haus"}); + await connection.Say(new BotMessage { ChatHub = dmChannel, Text = "Wuzzup - testing in da haus" }); } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs index 97e6e5d..5b97265 100644 --- a/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs +++ b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs @@ -28,8 +28,7 @@ public async Task PostMessage(string slackKey, string channel, string text, ILis .SetQueryParam("channel", channel) .SetQueryParam("text", text) .SetQueryParam("as_user", "true"); - - + if (attachments != null && attachments.Any()) { request.SetQueryParam("attachments", JsonConvert.SerializeObject(attachments)); diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 96e1a05..0f99969 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -32,7 +32,7 @@ public IHandshakeClient CreateHandshakeClient() public IChatClient CreateChatClient() { - return new RestSharpChatClient(_restSharpRequestExecutor); + return new FlurlChatClient(new ResponseVerifier()); } public IFileClient CreateFileClient() From c1bd6234face8277da10c670bba00973d11d1423 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Wed, 25 Jan 2017 12:35:46 +0000 Subject: [PATCH 19/24] Moving over functionality from Restsharp file to Flurl --- .../Clients/Flurl/FlurlFileClientTests.cs | 60 +++++++++++++++++++ .../RestSharpChannelClientTests.cs | 2 +- .../RestSharpChatClientTests.cs | 2 +- .../RestSharpFileClientTests.cs} | 4 +- .../SlackConnector.Tests.Unit.csproj | 7 ++- .../Clients/File/FlurlFileClient.cs | 37 ++++++++++++ src/SlackConnector/SlackConnector.csproj | 1 + 7 files changed, 106 insertions(+), 7 deletions(-) create mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs rename src/SlackConnector.Tests.Unit/Connections/Clients/{ => RestSharp}/RestSharpChannelClientTests.cs (97%) rename src/SlackConnector.Tests.Unit/Connections/Clients/{ => RestSharp}/RestSharpChatClientTests.cs (98%) rename src/SlackConnector.Tests.Unit/Connections/Clients/{FileClientTests.cs => RestSharp/RestSharpFileClientTests.cs} (98%) create mode 100644 src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs new file mode 100644 index 0000000..92b9fbd --- /dev/null +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs @@ -0,0 +1,60 @@ +using System.Threading.Tasks; +using Flurl; +using Flurl.Http.Testing; +using Moq; +using NUnit.Framework; +using SlackConnector.Connections.Clients; +using SlackConnector.Connections.Clients.Channel; +using SlackConnector.Connections.Clients.Chat; +using SlackConnector.Connections.Clients.File; +using SlackConnector.Connections.Responses; +using SlackConnector.Tests.Unit.TestExtensions; + +namespace SlackConnector.Tests.Unit.Connections.Clients.Flurl +{ + [TestFixture] + public class FlurlFileClientTests + { + private HttpTest _httpTest; + private Mock _responseVerifierMock; + private FlurlFileClient _fileClient; + + [SetUp] + public void Setup() + { + _httpTest = new HttpTest(); + _responseVerifierMock = new Mock(); + _fileClient = new FlurlFileClient(_responseVerifierMock.Object); + } + + [TearDown] + public void TearDown() + { + _httpTest.Dispose(); + } + + [Test] + public async Task should_call_expected_url_with_given_slack_key() + { + // given + const string slackKey = "something-that-looks-like-a-slack-key"; + const string channel = "channel-name"; + const string filePath = @"C:\test-file-name.exe"; + + var expectedResponse = new StandardResponse(); + _httpTest.RespondWithJson(expectedResponse); + + // when + await _fileClient.PostFile(slackKey, channel, filePath); + + // then + _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse))); + _httpTest + .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlFileClient.FILE_UPLOAD_PATH)) + .WithQueryParamValue("token", slackKey) + .WithQueryParamValue("channels", channel) + .WithQueryParamValue("filename", "test-file-name.exe") + .Times(1); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChannelClientTests.cs similarity index 97% rename from src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChannelClientTests.cs rename to src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChannelClientTests.cs index bb57978..2835b42 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChannelClientTests.cs @@ -8,7 +8,7 @@ using SlackConnector.Tests.Unit.Stubs; using SpecsFor; -namespace SlackConnector.Tests.Unit.Connections.Clients +namespace SlackConnector.Tests.Unit.Connections.Clients.RestSharp { public static class RestSharpChannelClientTests { diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChatClientTests.cs similarity index 98% rename from src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChatClientTests.cs rename to src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChatClientTests.cs index 0681224..cc8ef23 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharpChatClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChatClientTests.cs @@ -10,7 +10,7 @@ using SlackConnector.Tests.Unit.Stubs; using SpecsFor; -namespace SlackConnector.Tests.Unit.Connections.Clients +namespace SlackConnector.Tests.Unit.Connections.Clients.RestSharp { public static class RestSharpChatClientTests { diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpFileClientTests.cs similarity index 98% rename from src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs rename to src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpFileClientTests.cs index 515fe0d..c3ff1ce 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/FileClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpFileClientTests.cs @@ -8,9 +8,9 @@ using SlackConnector.Tests.Unit.Stubs; using SpecsFor; -namespace SlackConnector.Tests.Unit.Connections.Clients +namespace SlackConnector.Tests.Unit.Connections.Clients.RestSharp { - public static class FileClientTests + public static class RestSharpFileClientTests { internal class given_valid_standard_setup_when_posting_file : SpecsFor { diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index f9c62c2..9191142 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -151,12 +151,13 @@ - + + - - + + diff --git a/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs new file mode 100644 index 0000000..a112a79 --- /dev/null +++ b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs @@ -0,0 +1,37 @@ +using System.IO; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; +using SlackConnector.Connections.Responses; + +namespace SlackConnector.Connections.Clients.File +{ + internal class FlurlFileClient : IFileClient + { + private readonly IResponseVerifier _responseVerifier; + internal const string FILE_UPLOAD_PATH = "/api/files.upload"; + + public FlurlFileClient(IResponseVerifier responseVerifier) + { + _responseVerifier = responseVerifier; + } + + public async Task PostFile(string slackKey, string channel, string filePath) + { + var response = await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(FILE_UPLOAD_PATH) + .SetQueryParam("token", slackKey) + .SetQueryParam("channels", channel) + .SetQueryParam("filename", Path.GetFileName(filePath)) + .GetJsonAsync(); + + _responseVerifier.VerifyResponse(response); + } + + public Task PostFile(string slackKey, string channel, Stream stream, string fileName) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index c212904..8c11ffa 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -113,6 +113,7 @@ + From 95bc166487728c0e0716c947207680c05b53cef7 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 7 Feb 2017 09:24:18 +0000 Subject: [PATCH 20/24] FileClient is now correctly working with Flurl, need to figure out how to unit test it --- .../Clients/File/FlurlFileClient.cs | 21 ++++++++++++++----- .../Connections/ConnectionFactory.cs | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs index a112a79..01f04ef 100644 --- a/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs +++ b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Flurl; using Flurl.Http; +using Newtonsoft.Json; using SlackConnector.Connections.Responses; namespace SlackConnector.Connections.Clients.File @@ -18,20 +19,30 @@ public FlurlFileClient(IResponseVerifier responseVerifier) public async Task PostFile(string slackKey, string channel, string filePath) { - var response = await ClientConstants + var httpResponse = await ClientConstants .HANDSHAKE_PATH .AppendPathSegment(FILE_UPLOAD_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("channels", channel) - .SetQueryParam("filename", Path.GetFileName(filePath)) - .GetJsonAsync(); + .PostMultipartAsync(content => content.AddFile("file", filePath)); + var responseContent = await httpResponse.Content.ReadAsStringAsync(); + var response = JsonConvert.DeserializeObject(responseContent); _responseVerifier.VerifyResponse(response); } - public Task PostFile(string slackKey, string channel, Stream stream, string fileName) + public async Task PostFile(string slackKey, string channel, Stream stream, string fileName) { - throw new System.NotImplementedException(); + var httpResponse = await ClientConstants + .HANDSHAKE_PATH + .AppendPathSegment(FILE_UPLOAD_PATH) + .SetQueryParam("token", slackKey) + .SetQueryParam("channels", channel) + .PostMultipartAsync(content => content.AddFile("file", stream, fileName)); + + var responseContent = await httpResponse.Content.ReadAsStringAsync(); + var response = JsonConvert.DeserializeObject(responseContent); + _responseVerifier.VerifyResponse(response); } } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 0f99969..436e149 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -37,7 +37,7 @@ public IChatClient CreateChatClient() public IFileClient CreateFileClient() { - return new RestSharpFileClient(_restSharpRequestExecutor); + return new FlurlFileClient(new ResponseVerifier()); } public IChannelClient CreateChannelClient() From 020ea6499034566d596c0ee8717ac0c7862e518f Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 7 Feb 2017 09:24:52 +0000 Subject: [PATCH 21/24] A basic test for file upload, however doesn't test everything Might have to leave for Int tests to pick up :confounded: --- .../Connections/Clients/Flurl/FlurlFileClientTests.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs index 92b9fbd..3839fda 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Net.Http; +using System.Threading.Tasks; using Flurl; using Flurl.Http.Testing; using Moq; @@ -53,7 +54,9 @@ public async Task should_call_expected_url_with_given_slack_key() .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlFileClient.FILE_UPLOAD_PATH)) .WithQueryParamValue("token", slackKey) .WithQueryParamValue("channels", channel) - .WithQueryParamValue("filename", "test-file-name.exe") + //.WithQueryParamValue("filename", "test-file-name.exe") + .WithVerb(HttpMethod.Post) + .WithContentType("multipart/form-data") .Times(1); } } From f0b830cb996efaf078b2aab2cd04ed6de9a7a34e Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 7 Feb 2017 09:25:34 +0000 Subject: [PATCH 22/24] Rename const to reflect that its a host url --- .../Connections/Clients/Flurl/FlurlChannelClientTests.cs | 8 ++++---- .../Connections/Clients/Flurl/FlurlChatClientTests.cs | 4 ++-- .../Connections/Clients/Flurl/FlurlFileClientTests.cs | 2 +- .../Clients/Flurl/FlurlHandshakeClientTests.cs | 2 +- .../Connections/Clients/Channel/FlurlChannelClient.cs | 8 ++++---- .../Connections/Clients/Chat/FlurlChatClient.cs | 2 +- src/SlackConnector/Connections/Clients/ClientConstants.cs | 2 +- .../Connections/Clients/File/FlurlFileClient.cs | 4 ++-- .../Connections/Clients/Handshake/FlurlHandshakeClient.cs | 2 +- .../Clients/RestSharpRestSharpRequestExecutor.cs | 2 +- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs index cccfe30..47a9243 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChannelClientTests.cs @@ -57,7 +57,7 @@ public async Task should_join_direct_message_channel() // then _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.JOIN_DM_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlChannelClient.JOIN_DM_PATH)) .WithQueryParamValue("token", slackKey) .WithQueryParamValue("user", userId) .Times(1); @@ -88,7 +88,7 @@ public async Task should_call_expected_url_and_return_expected_channels() // then _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.CHANNELS_LIST_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlChannelClient.CHANNELS_LIST_PATH)) .WithQueryParamValue("token", slackKey) .Times(1); @@ -118,7 +118,7 @@ public async Task should_call_expected_url_and_return_expected_groups() // then _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.GROUPS_LIST_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlChannelClient.GROUPS_LIST_PATH)) .WithQueryParamValue("token", slackKey) .Times(1); @@ -148,7 +148,7 @@ public async Task should_call_expected_url_and_return_expected_users() // then _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse)), Times.Once); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChannelClient.USERS_LIST_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlChannelClient.USERS_LIST_PATH)) .WithQueryParamValue("token", slackKey) .WithQueryParamValue("presence", "1") .Times(1); diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs index 2305c5b..dba5b33 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlChatClientTests.cs @@ -51,7 +51,7 @@ public async Task should_call_expected_url_with_given_slack_key() // then _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse))); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChatClient.SEND_MESSAGE_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlChatClient.SEND_MESSAGE_PATH)) .WithQueryParamValue("token", slackKey) .WithQueryParamValue("channel", channel) .WithQueryParamValue("text", text) @@ -76,7 +76,7 @@ public async Task should_add_attachments_if_given() // then _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlChatClient.SEND_MESSAGE_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlChatClient.SEND_MESSAGE_PATH)) .WithQueryParamValue("attachments", JsonConvert.SerializeObject(attachments)) .Times(1); } diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs index 3839fda..247adc8 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs @@ -51,7 +51,7 @@ public async Task should_call_expected_url_with_given_slack_key() // then _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse))); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlFileClient.FILE_UPLOAD_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlFileClient.FILE_UPLOAD_PATH)) .WithQueryParamValue("token", slackKey) .WithQueryParamValue("channels", channel) //.WithQueryParamValue("filename", "test-file-name.exe") diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs index 0aa8e16..46b9e75 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlHandshakeClientTests.cs @@ -51,7 +51,7 @@ public async Task should_call_expected_url_with_given_slack_key() // then _responseVerifierMock.Verify(x => x.VerifyResponse(Looks.Like(expectedResponse))); _httpTest - .ShouldHaveCalled(ClientConstants.HANDSHAKE_PATH.AppendPathSegment(FlurlHandshakeClient.HANDSHAKE_PATH)) + .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlHandshakeClient.HANDSHAKE_PATH)) .WithQueryParamValue("token", slackKey) .Times(1); diff --git a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs index 60f68de..9150979 100644 --- a/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs +++ b/src/SlackConnector/Connections/Clients/Channel/FlurlChannelClient.cs @@ -22,7 +22,7 @@ public FlurlChannelClient(IResponseVerifier responseVerifier) public async Task JoinDirectMessageChannel(string slackKey, string user) { var response = await ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(JOIN_DM_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("user", user) @@ -35,7 +35,7 @@ public FlurlChannelClient(IResponseVerifier responseVerifier) public async Task GetChannels(string slackKey) { var response = await ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(CHANNELS_LIST_PATH) .SetQueryParam("token", slackKey) .GetJsonAsync(); @@ -47,7 +47,7 @@ public FlurlChannelClient(IResponseVerifier responseVerifier) public async Task GetGroups(string slackKey) { var response = await ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(GROUPS_LIST_PATH) .SetQueryParam("token", slackKey) .GetJsonAsync(); @@ -59,7 +59,7 @@ public async Task GetGroups(string slackKey) public async Task GetUsers(string slackKey) { var response = await ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(USERS_LIST_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("presence", "1") diff --git a/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs index 5b97265..7bc1106 100644 --- a/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs +++ b/src/SlackConnector/Connections/Clients/Chat/FlurlChatClient.cs @@ -22,7 +22,7 @@ public FlurlChatClient(IResponseVerifier responseVerifier) public async Task PostMessage(string slackKey, string channel, string text, IList attachments) { var request = ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(SEND_MESSAGE_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("channel", channel) diff --git a/src/SlackConnector/Connections/Clients/ClientConstants.cs b/src/SlackConnector/Connections/Clients/ClientConstants.cs index c1f247e..07b5c14 100644 --- a/src/SlackConnector/Connections/Clients/ClientConstants.cs +++ b/src/SlackConnector/Connections/Clients/ClientConstants.cs @@ -2,6 +2,6 @@ { internal static class ClientConstants { - internal const string HANDSHAKE_PATH = "https://slack.com"; + internal const string SlackApiHost = "https://slack.com"; } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs index 01f04ef..8702726 100644 --- a/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs +++ b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs @@ -20,7 +20,7 @@ public FlurlFileClient(IResponseVerifier responseVerifier) public async Task PostFile(string slackKey, string channel, string filePath) { var httpResponse = await ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(FILE_UPLOAD_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("channels", channel) @@ -34,7 +34,7 @@ public async Task PostFile(string slackKey, string channel, string filePath) public async Task PostFile(string slackKey, string channel, Stream stream, string fileName) { var httpResponse = await ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(FILE_UPLOAD_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("channels", channel) diff --git a/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs b/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs index ed4cb0b..9c0101a 100644 --- a/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs +++ b/src/SlackConnector/Connections/Clients/Handshake/FlurlHandshakeClient.cs @@ -18,7 +18,7 @@ public FlurlHandshakeClient(IResponseVerifier responseVerifier) public async Task FirmShake(string slackKey) { var response = await ClientConstants - .HANDSHAKE_PATH + .SlackApiHost .AppendPathSegment(HANDSHAKE_PATH) .SetQueryParam("token", slackKey) .GetJsonAsync(); diff --git a/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs b/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs index ff7832e..8a981e6 100644 --- a/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs +++ b/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs @@ -5,7 +5,7 @@ namespace SlackConnector.Connections.Clients { internal class RestSharpRestSharpRequestExecutor : IRestSharpRequestExecutor { - internal static string SLACK_URL => ClientConstants.HANDSHAKE_PATH; + internal static string SLACK_URL => ClientConstants.SlackApiHost; private readonly IRestSharpFactory _restSharpFactory; private readonly IResponseVerifier _responseVerifier; From 7a8065ffcc1790b2e17c7638b4bbab6efdd1b918 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 7 Feb 2017 22:39:19 +0000 Subject: [PATCH 23/24] refactor: Naming and comments --- .../Connections/Clients/Flurl/FlurlFileClientTests.cs | 1 - .../Connections/Clients/File/FlurlFileClient.cs | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs index 247adc8..b7226c4 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/Flurl/FlurlFileClientTests.cs @@ -54,7 +54,6 @@ public async Task should_call_expected_url_with_given_slack_key() .ShouldHaveCalled(ClientConstants.SlackApiHost.AppendPathSegment(FlurlFileClient.FILE_UPLOAD_PATH)) .WithQueryParamValue("token", slackKey) .WithQueryParamValue("channels", channel) - //.WithQueryParamValue("filename", "test-file-name.exe") .WithVerb(HttpMethod.Post) .WithContentType("multipart/form-data") .Times(1); diff --git a/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs index 8702726..7b14328 100644 --- a/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs +++ b/src/SlackConnector/Connections/Clients/File/FlurlFileClient.cs @@ -11,6 +11,7 @@ internal class FlurlFileClient : IFileClient { private readonly IResponseVerifier _responseVerifier; internal const string FILE_UPLOAD_PATH = "/api/files.upload"; + internal const string POST_FILE_VARIABLE_NAME = "file"; public FlurlFileClient(IResponseVerifier responseVerifier) { @@ -24,7 +25,7 @@ public async Task PostFile(string slackKey, string channel, string filePath) .AppendPathSegment(FILE_UPLOAD_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("channels", channel) - .PostMultipartAsync(content => content.AddFile("file", filePath)); + .PostMultipartAsync(content => content.AddFile(POST_FILE_VARIABLE_NAME, filePath)); var responseContent = await httpResponse.Content.ReadAsStringAsync(); var response = JsonConvert.DeserializeObject(responseContent); @@ -38,7 +39,7 @@ public async Task PostFile(string slackKey, string channel, Stream stream, strin .AppendPathSegment(FILE_UPLOAD_PATH) .SetQueryParam("token", slackKey) .SetQueryParam("channels", channel) - .PostMultipartAsync(content => content.AddFile("file", stream, fileName)); + .PostMultipartAsync(content => content.AddFile(POST_FILE_VARIABLE_NAME, stream, fileName)); var responseContent = await httpResponse.Content.ReadAsStringAsync(); var response = JsonConvert.DeserializeObject(responseContent); From 3e162df609e50c89ac802f88657d6e5fcb8f7b89 Mon Sep 17 00:00:00 2001 From: Simon Colmer Date: Tue, 7 Feb 2017 22:45:59 +0000 Subject: [PATCH 24/24] Removed all rest sharp references --- .../Clients/RequestExecutorTests.cs | 57 ---- .../Clients/ResponseVerifierTests.cs | 286 ++---------------- .../RestSharp/RestSharpChannelClientTests.cs | 84 ----- .../RestSharp/RestSharpChatClientTests.cs | 143 --------- .../RestSharp/RestSharpFileClientTests.cs | 176 ----------- .../SlackConnector.Tests.Unit.csproj | 10 - .../Stubs/RestClientStub.cs | 194 ------------ .../Stubs/RestSharpRequestExecutorStub.cs | 19 -- src/SlackConnector.Tests.Unit/packages.config | 1 - .../Clients/Channel/RestSharpChannelClient.cs | 59 ---- .../Clients/Chat/RestSharpChatClient.cs | 37 --- .../Clients/File/RestSharpFileClient.cs | 57 ---- .../Connections/Clients/IResponseVerifier.cs | 4 +- .../Clients/IRestSharpRequestExecutor.cs | 10 - .../Connections/Clients/ResponseVerifier.cs | 17 -- .../RestSharpRestSharpRequestExecutor.cs | 26 -- .../Connections/ConnectionFactory.cs | 9 - .../Connections/IRestSharpFactory.cs | 9 - .../Connections/RestSharpFactory.cs | 12 - src/SlackConnector/SlackConnector.csproj | 11 - src/SlackConnector/packages.config | 1 - 21 files changed, 19 insertions(+), 1203 deletions(-) delete mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs delete mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChannelClientTests.cs delete mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChatClientTests.cs delete mode 100644 src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpFileClientTests.cs delete mode 100644 src/SlackConnector.Tests.Unit/Stubs/RestClientStub.cs delete mode 100644 src/SlackConnector.Tests.Unit/Stubs/RestSharpRequestExecutorStub.cs delete mode 100644 src/SlackConnector/Connections/Clients/Channel/RestSharpChannelClient.cs delete mode 100644 src/SlackConnector/Connections/Clients/Chat/RestSharpChatClient.cs delete mode 100644 src/SlackConnector/Connections/Clients/File/RestSharpFileClient.cs delete mode 100644 src/SlackConnector/Connections/Clients/IRestSharpRequestExecutor.cs delete mode 100644 src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs delete mode 100644 src/SlackConnector/Connections/IRestSharpFactory.cs delete mode 100644 src/SlackConnector/Connections/RestSharpFactory.cs diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs deleted file mode 100644 index 2a3c418..0000000 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RequestExecutorTests.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Moq; -using NUnit.Framework; -using RestSharp; -using Should; -using SlackConnector.Connections; -using SlackConnector.Connections.Clients; -using SlackConnector.Connections.Responses; -using SpecsFor; - -namespace SlackConnector.Tests.Unit.Connections.Clients -{ - public static class RequestExecutorTests - { - internal class given_request_when_executing : SpecsFor - { - private IRestRequest _request; - private IRestResponse _response; - private ExampleResponse _expectedResult; - private ExampleResponse Result { get; set; } - - protected override void Given() - { - _request = new RestRequest(); - _response = new RestResponse(); - - GetMockFor() - .Setup(x => x.CreateClient(RestSharpRestSharpRequestExecutor.SLACK_URL)) - .Returns(GetMockFor().Object); - - GetMockFor() - .Setup(x => x.ExecutePostTaskAsync(_request)) - .ReturnsAsync(_response); - - _expectedResult = new ExampleResponse(); - GetMockFor() - .Setup(x => x.VerifyResponse(_response)) - .Returns(_expectedResult); - } - - protected override void When() - { - Result = SUT.Execute(_request).Result; - } - - [Test] - public void then_should_return_expected_result() - { - Result.ShouldEqual(_expectedResult); - } - } - - private class ExampleResponse : StandardResponse - { - - } - } -} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs index 8106e45..163e9f9 100644 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs +++ b/src/SlackConnector.Tests.Unit/Connections/Clients/ResponseVerifierTests.cs @@ -1,285 +1,35 @@ -using System.Net; -using NUnit.Framework; -using RestSharp; +using NUnit.Framework; using Should; using SlackConnector.Connections.Clients; -using SlackConnector.Connections.Models; using SlackConnector.Connections.Responses; using SlackConnector.Exceptions; -using SpecsFor; -using SpecsFor.ShouldExtensions; namespace SlackConnector.Tests.Unit.Connections.Clients { - public static class ResponseVerifierTests + [TestFixture] + public class ResponseVerifierTests { - internal class given_valid_response_then_should_return_expected_object : SpecsFor + [Test] + public void should_throw_exception_with_given_error_message_when_request_failed() { - private IRestResponse restResponse; - private ExampleModel Result { get; set; } + // given + var response = new StandardResponse { Ok = false, Error = "I AM A ERROR-message" }; + var verifier = new ResponseVerifier(); - protected override void Given() - { - restResponse = new RestResponse - { - StatusCode = HttpStatusCode.OK, - Content = @"{'ok': true, 'value': 'test'}" - }; - } - - protected override void When() - { - Result = SUT.VerifyResponse(restResponse); - } - - [Test] - public void then_should_return_expected_model() - { - var expected = new ExampleModel - { - Ok = true, - Value = "test" - }; - Result.ShouldLookLike(expected); - } - } - - internal class given_invalid_http_response_then_should_throw_exception : SpecsFor - { - private IRestResponse restResponse; - - protected override void Given() - { - restResponse = new RestResponse - { - StatusCode = HttpStatusCode.BadRequest - }; - } - - - [Test] - public void then_should_throw_expected_exception() - { - CommunicationException exception = null; - - try - { - SUT.VerifyResponse(restResponse); - } - catch (CommunicationException ex) - { - exception = ex; - } - - string expectedMessage = $"Error occured while sending message '{restResponse.StatusCode}'"; - exception.ShouldNotBeNull(); - exception.Message.ShouldEqual(expectedMessage); - } + // when && then + var exception = Assert.Throws(() => verifier.VerifyResponse(response)); + exception.Message.ShouldEqual($"Error occured while posting message '{response.Error}'"); } - internal class given_error_in_response_json_then_should_throw_exception : SpecsFor + [Test] + public void should_not_throw_exception() { - private IRestResponse restResponse; - - protected override void Given() - { - restResponse = new RestResponse - { - StatusCode = HttpStatusCode.OK, - Content = @"{'ok': false, 'error': 'test error'}" - }; - } - - - [Test] - public void then_should_throw_expected_exception() - { - CommunicationException exception = null; - - try - { - SUT.VerifyResponse(restResponse); - } - catch (CommunicationException ex) - { - exception = ex; - } - - exception.ShouldNotBeNull(); - exception.Message.ShouldEqual("Error occured while posting message 'test error'"); - } - } - - internal class given_join_channel_response : SpecsFor - { - private IRestResponse _restResponse; - private JoinChannelResponse Result { get; set; } - - protected override void Given() - { - _restResponse = new RestResponse - { - StatusCode = HttpStatusCode.OK, - Content = @"{ - 'ok':true, - 'channel': { - 'id': 'my-id', - 'name': 'my-name', - } - }" - }; - } - - protected override void When() - { - Result = SUT.VerifyResponse(_restResponse); - } - - [Test] - public void should_return_expected_channel_response() - { - var expected = new JoinChannelResponse - { - Ok = true, - Error = null, - Channel = new Channel - { - Id = "my-id", - Name = "my-name" - } - }; - - Result.ShouldLookLike(expected); - } - } - - internal class given_handshake_response : SpecsFor - { - private IRestResponse _restResponse; - private HandshakeResponse Result { get; set; } - - protected override void Given() - { - _restResponse = new RestResponse - { - StatusCode = HttpStatusCode.OK, - Content = Resources.ResourceManager.GetHandShakeResponseJson() - }; - } - - protected override void When() - { - Result = SUT.VerifyResponse(_restResponse); - } - - [Test] - public void should_return_expected_channel_response() - { - var expected = new HandshakeResponse - { - Ok = true, - Self = new Detail - { - Id = "self-id", - Name = "self-name" - }, - Team = new Detail - { - Id = "team-id", - Name = "team-name" - }, - Channels = new[] - { - new Channel - { - Id = "channel-id", - Name = "channel-name", - IsChannel = true, - IsArchived = true, - IsMember = true - } - }, - Groups = new[] - { - new Group - { - Id = "group-id", - Name = "group-name", - IsGroup = true, - IsArchived = true, - IsOpen = true, - Members = new [] - { - "member1" - } - } - }, - Ims = new[] - { - new Im - { - Id = "im-id", - User = "im-user", - IsIm = true, - IsOpen = true - } - }, - Users = new[] - { - new User - { - Id = "user-id", - Name = "user-name", - Deleted = true, - Profile = new Profile - { - FirstName = "first-name", - LastName = "last-name", - RealName = "real-name", - RealNameNormalised = "real-name-normalized", - Email = "email" - }, - IsAdmin = true, - IsBot = true - } - }, - WebSocketUrl = @"wss://ms331.slack-msgs.com/websocket/999" - }; - - Result.ShouldLookLike(expected); - } - } - - private class ExampleModel : StandardResponse - { - public string Value { get; set; } - } - - [TestFixture] - public class ResponseVerifierTests2 - { - [Test] - public void should_throw_exception_with_given_error_message_when_request_failed() - { - // given - var response = new StandardResponse { Ok = false, Error = "I AM A ERROR-message" }; - var verifier = new ResponseVerifier(); - - // when && then - var exception = Assert.Throws(() => verifier.VerifyResponse(response)); - exception.Message.ShouldEqual($"Error occured while posting message '{response.Error}'"); - } - - [Test] - public void should_not_throw_exception() - { - // given - var response = new StandardResponse { Ok = true }; - var verifier = new ResponseVerifier(); + // given + var response = new StandardResponse { Ok = true }; + var verifier = new ResponseVerifier(); - // when && then - Assert.DoesNotThrow(() => verifier.VerifyResponse(response)); - } + // when && then + Assert.DoesNotThrow(() => verifier.VerifyResponse(response)); } } } \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChannelClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChannelClientTests.cs deleted file mode 100644 index 2835b42..0000000 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChannelClientTests.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Linq; -using NUnit.Framework; -using RestSharp; -using Should; -using SlackConnector.Connections.Clients.Channel; -using SlackConnector.Connections.Models; -using SlackConnector.Connections.Responses; -using SlackConnector.Tests.Unit.Stubs; -using SpecsFor; - -namespace SlackConnector.Tests.Unit.Connections.Clients.RestSharp -{ - public static class RestSharpChannelClientTests - { - internal class given_valid_standard_setup : SpecsFor - { - private string _slackKey = "super-key"; - private string _user = "super-user"; - private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; - private JoinChannelResponse _executorResponse; - private Channel Result { get; set; } - - protected override void InitializeClassUnderTest() - { - _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new RestSharpChannelClient(_restSharpRequestExecutorStub); - } - - protected override void Given() - { - _executorResponse = new JoinChannelResponse - { - Channel = new Channel() - }; - _restSharpRequestExecutorStub.Execute_Value = _executorResponse; - } - - protected override void When() - { - Result = SUT.JoinDirectMessageChannel(_slackKey, _user).Result; - } - - [Test] - public void then_should_pass_expected_key() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_slackKey); - } - - [Test] - public void then_should_pass_expected_channel() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("user")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_user); - } - - [Test] - public void then_should_access_expected_path() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(RestSharpChannelClient.JOIN_DM_PATH); - } - - [Test] - public void then_should_have_2_params() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Parameters.Count.ShouldEqual(2); - } - - [Test] - public void then_should_return_expected_channel() - { - Result.ShouldEqual(_executorResponse.Channel); - } - } - } -} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChatClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChatClientTests.cs deleted file mode 100644 index cc8ef23..0000000 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpChatClientTests.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; -using NUnit.Framework; -using RestSharp; -using Should; -using SlackConnector.Connections.Clients.Chat; -using SlackConnector.Connections.Responses; -using SlackConnector.Models; -using SlackConnector.Tests.Unit.Stubs; -using SpecsFor; - -namespace SlackConnector.Tests.Unit.Connections.Clients.RestSharp -{ - public static class RestSharpChatClientTests - { - internal class given_valid_standard_setup_when_posting_message_without_attachments : SpecsFor - { - private string _slackKey = "super-key"; - private string _channel = "super-channel"; - private string _text = "boom-jiggy-boom"; - private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; - - protected override void InitializeClassUnderTest() - { - _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new RestSharpChatClient(_restSharpRequestExecutorStub); - } - - protected override void Given() - { - _restSharpRequestExecutorStub.Execute_Value = new StandardResponse(); - } - - protected override void When() - { - SUT.PostMessage(_slackKey, _channel, _text, null).Wait(); - } - - [Test] - public void then_should_pass_expected_key() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_slackKey); - } - - [Test] - public void then_should_pass_expected_channel() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("channel")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_channel); - } - - [Test] - public void then_should_pass_expected_text() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("text")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_text); - } - - [Test] - public void then_should_pass_expected_user_param() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("as_user")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual("true"); - } - - [Test] - public void then_should_access_expected_path() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(RestSharpChatClient.SEND_MESSAGE_PATH); - } - - [Test] - public void then_should_have_4_params() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Parameters.Count.ShouldEqual(4); - } - } - - internal class given_valid_standard_setup_when_posting_message_with_attachments : SpecsFor - { - private List _attachments; - private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; - - protected override void InitializeClassUnderTest() - { - _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new RestSharpChatClient(_restSharpRequestExecutorStub); - } - - protected override void Given() - { - _attachments = new List - { - new SlackAttachment - { - Text = "Some Text", - Title = "Some Title" - } - }; - } - - protected override void When() - { - SUT.PostMessage(null, null, null, _attachments).Wait(); - } - - [Test] - public void then_should_pass_expected_text() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter attachments = request.Parameters.FirstOrDefault(x => x.Name.Equals("attachments")); - attachments.ShouldNotBeNull(); - attachments.Type.ShouldEqual(ParameterType.GetOrPost); - - string attachmentsJson = attachments.Value as string; - attachmentsJson.ShouldEqual(JsonConvert.SerializeObject(_attachments)); - } - - [Test] - public void then_should_have_5_params() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Parameters.Count.ShouldEqual(5); - } - } - } -} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpFileClientTests.cs b/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpFileClientTests.cs deleted file mode 100644 index c3ff1ce..0000000 --- a/src/SlackConnector.Tests.Unit/Connections/Clients/RestSharp/RestSharpFileClientTests.cs +++ /dev/null @@ -1,176 +0,0 @@ -using System.IO; -using System.Linq; -using System.Text; -using NUnit.Framework; -using RestSharp; -using Should; -using SlackConnector.Connections.Clients.File; -using SlackConnector.Tests.Unit.Stubs; -using SpecsFor; - -namespace SlackConnector.Tests.Unit.Connections.Clients.RestSharp -{ - public static class RestSharpFileClientTests - { - internal class given_valid_standard_setup_when_posting_file : SpecsFor - { - private readonly string _slackKey = "super-key"; - private readonly string _channelId = "channel-id"; - private readonly string _filePath = Path.GetTempFileName(); - private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; - - protected override void InitializeClassUnderTest() - { - _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new RestSharpFileClient(_restSharpRequestExecutorStub); - } - - protected override void Given() - { - File.WriteAllText(_filePath, "test-data"); - } - - protected override void When() - { - SUT.PostFile(_slackKey, _channelId, _filePath).Wait(); - } - - [Test] - public void then_should_pass_expected_key() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_slackKey); - } - - [Test] - public void then_should_pass_expected_channel() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("channels")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_channelId); - } - - [Test] - public void then_should_access_expected_path() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(RestSharpFileClient.FILE_UPLOAD_PATH); - } - - [Test] - public void then_should_have_3_params() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Parameters.Count.ShouldEqual(3); - } - - [Test] - public void then_should_pass_expected_filename() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("filename")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(Path.GetFileName(_filePath)); - } - - [Test] - public void then_should_pass_expected_file() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - FileParameter file = request.Files.FirstOrDefault(x => x.Name.Equals("file")); - file.ShouldNotBeNull(); - file.ContentLength.ShouldBeGreaterThan(0); - file.FileName.ShouldEqual(Path.GetFileName(_filePath)); - } - } - - internal class given_valid_standard_setup_when_posting_stream : SpecsFor - { - private readonly string _slackKey = "super-key"; - private readonly string _channelId = "channel-id"; - private readonly string _fileName = "file-name.txt"; - private MemoryStream _inputStream; - private RestSharpRequestExecutorStub _restSharpRequestExecutorStub; - - protected override void InitializeClassUnderTest() - { - _restSharpRequestExecutorStub = new RestSharpRequestExecutorStub(); - SUT = new RestSharpFileClient(_restSharpRequestExecutorStub); - } - - protected override void Given() - { - _inputStream = new MemoryStream(); - using (var writer = new StreamWriter(_inputStream, Encoding.UTF8)) - { - writer.WriteLine("Some test value - yay :-)"); - } - } - - protected override void When() - { - SUT.PostFile(_slackKey, _channelId, _inputStream, _fileName).Wait(); - } - - [Test] - public void then_should_pass_expected_key() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("token")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_slackKey); - } - - [Test] - public void then_should_pass_expected_channel() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("channels")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(_channelId); - } - - [Test] - public void then_should_access_expected_path() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Resource.ShouldEqual(RestSharpFileClient.FILE_UPLOAD_PATH); - } - - [Test] - public void then_should_have_3_params() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - request.Parameters.Count.ShouldEqual(3); - } - - [Test] - public void then_should_pass_expected_filename() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - Parameter keyParam = request.Parameters.FirstOrDefault(x => x.Name.Equals("filename")); - keyParam.ShouldNotBeNull(); - keyParam.Type.ShouldEqual(ParameterType.GetOrPost); - keyParam.Value.ShouldEqual(Path.GetFileName(_fileName)); - } - - [Test] - public void then_should_pass_expected_file() - { - IRestRequest request = _restSharpRequestExecutorStub.Execute_Request; - FileParameter file = request.Files.FirstOrDefault(x => x.Name.Equals("file")); - file.ShouldNotBeNull(); - file.ContentLength.ShouldBeGreaterThan(0); - file.FileName.ShouldEqual(Path.GetFileName(_fileName)); - } - } - } -} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj index 9191142..efd2d22 100644 --- a/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj +++ b/src/SlackConnector.Tests.Unit/SlackConnector.Tests.Unit.csproj @@ -76,10 +76,6 @@ ..\..\packages\NUnitTestAdapter.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll False - - ..\..\packages\RestSharp.105.2.3\lib\net46\RestSharp.dll - True - ..\..\packages\Should.1.1.20\lib\Should.dll True @@ -151,14 +147,10 @@ - - - - @@ -182,8 +174,6 @@ - - diff --git a/src/SlackConnector.Tests.Unit/Stubs/RestClientStub.cs b/src/SlackConnector.Tests.Unit/Stubs/RestClientStub.cs deleted file mode 100644 index ac1fa36..0000000 --- a/src/SlackConnector.Tests.Unit/Stubs/RestClientStub.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Cache; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using RestSharp; -using RestSharp.Authenticators; -using RestSharp.Deserializers; - -namespace SlackConnector.Tests.Unit.Stubs -{ - public class RestClientStub : IRestClient - { - public string ExecutePostTaskAsync_Content { get; set; } - public HttpStatusCode ExecutePostTaskAsync_StatusCode { get; set; } - public IRestRequest ExecutePostTaskAsync_Request { get; private set; } - public IRestResponse ExecutePostTaskAsync_Response { get; set; } - public async Task ExecutePostTaskAsync(IRestRequest request) - { - ExecutePostTaskAsync_Request = request; - - var response = ExecutePostTaskAsync_Response ?? new RestResponse - { - Content = ExecutePostTaskAsync_Content, - StatusCode = ExecutePostTaskAsync_StatusCode - }; - - return await Task.FromResult(response); - } - - #region Not Implemented - - public RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action callback) - { - throw new NotImplementedException(); - } - - public RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action, RestRequestAsyncHandle> callback) - { - throw new NotImplementedException(); - } - - public IRestResponse Execute(IRestRequest request) - { - throw new NotImplementedException(); - } - - public IRestResponse Execute(IRestRequest request) where T : new() - { - throw new NotImplementedException(); - } - - public byte[] DownloadData(IRestRequest request) - { - throw new NotImplementedException(); - } - - public Uri BuildUri(IRestRequest request) - { - throw new NotImplementedException(); - } - - public RestRequestAsyncHandle ExecuteAsyncGet(IRestRequest request, Action callback, string httpMethod) - { - throw new NotImplementedException(); - } - - public RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action callback, string httpMethod) - { - throw new NotImplementedException(); - } - - public RestRequestAsyncHandle ExecuteAsyncGet(IRestRequest request, Action, RestRequestAsyncHandle> callback, string httpMethod) - { - throw new NotImplementedException(); - } - - public RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action, RestRequestAsyncHandle> callback, string httpMethod) - { - throw new NotImplementedException(); - } - - public void AddHandler(string contentType, IDeserializer deserializer) - { - throw new NotImplementedException(); - } - - public void RemoveHandler(string contentType) - { - throw new NotImplementedException(); - } - - public void ClearHandlers() - { - throw new NotImplementedException(); - } - - public IRestResponse ExecuteAsGet(IRestRequest request, string httpMethod) - { - throw new NotImplementedException(); - } - - public IRestResponse ExecuteAsPost(IRestRequest request, string httpMethod) - { - throw new NotImplementedException(); - } - - public IRestResponse ExecuteAsGet(IRestRequest request, string httpMethod) where T : new() - { - throw new NotImplementedException(); - } - - public IRestResponse ExecuteAsPost(IRestRequest request, string httpMethod) where T : new() - { - throw new NotImplementedException(); - } - - public Task> ExecuteTaskAsync(IRestRequest request, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task> ExecuteTaskAsync(IRestRequest request) - { - throw new NotImplementedException(); - } - - public Task> ExecuteGetTaskAsync(IRestRequest request) - { - throw new NotImplementedException(); - } - - public Task> ExecuteGetTaskAsync(IRestRequest request, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task> ExecutePostTaskAsync(IRestRequest request) - { - throw new NotImplementedException(); - } - - public Task> ExecutePostTaskAsync(IRestRequest request, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task ExecuteTaskAsync(IRestRequest request, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task ExecuteTaskAsync(IRestRequest request) - { - throw new NotImplementedException(); - } - - public Task ExecuteGetTaskAsync(IRestRequest request) - { - throw new NotImplementedException(); - } - - public Task ExecuteGetTaskAsync(IRestRequest request, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task ExecutePostTaskAsync(IRestRequest request, CancellationToken token) - { - throw new NotImplementedException(); - } - - public CookieContainer CookieContainer { get; set; } - public int? MaxRedirects { get; set; } - public string UserAgent { get; set; } - public int Timeout { get; set; } - public int ReadWriteTimeout { get; set; } - public bool UseSynchronizationContext { get; set; } - public IAuthenticator Authenticator { get; set; } - public Uri BaseUrl { get; set; } - public Encoding Encoding { get; set; } - public bool PreAuthenticate { get; set; } - public IList DefaultParameters { get; } - public X509CertificateCollection ClientCertificates { get; set; } - public IWebProxy Proxy { get; set; } - public RequestCachePolicy CachePolicy { get; set; } - public bool FollowRedirects { get; set; } - - #endregion - } -} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/Stubs/RestSharpRequestExecutorStub.cs b/src/SlackConnector.Tests.Unit/Stubs/RestSharpRequestExecutorStub.cs deleted file mode 100644 index 49b2ee8..0000000 --- a/src/SlackConnector.Tests.Unit/Stubs/RestSharpRequestExecutorStub.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Threading.Tasks; -using RestSharp; -using SlackConnector.Connections.Clients; -using SlackConnector.Connections.Responses; - -namespace SlackConnector.Tests.Unit.Stubs -{ - internal class RestSharpRequestExecutorStub : IRestSharpRequestExecutor - { - public IRestRequest Execute_Request { get; private set; } - public StandardResponse Execute_Value { get; set; } - - public Task Execute(IRestRequest request) where T : class - { - Execute_Request = request; - return Task.FromResult(Execute_Value as T); - } - } -} \ No newline at end of file diff --git a/src/SlackConnector.Tests.Unit/packages.config b/src/SlackConnector.Tests.Unit/packages.config index 3fb2b5d..27b431e 100644 --- a/src/SlackConnector.Tests.Unit/packages.config +++ b/src/SlackConnector.Tests.Unit/packages.config @@ -8,7 +8,6 @@ - diff --git a/src/SlackConnector/Connections/Clients/Channel/RestSharpChannelClient.cs b/src/SlackConnector/Connections/Clients/Channel/RestSharpChannelClient.cs deleted file mode 100644 index 3aebe9e..0000000 --- a/src/SlackConnector/Connections/Clients/Channel/RestSharpChannelClient.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Threading.Tasks; -using RestSharp; -using SlackConnector.Connections.Models; -using SlackConnector.Connections.Responses; - -namespace SlackConnector.Connections.Clients.Channel -{ - internal class RestSharpChannelClient : IChannelClient - { - internal const string JOIN_DM_PATH = "/api/im.open"; - internal const string CHANNELS_LIST_PATH = "/api/channels.list"; - internal const string GROUPS_LIST_PATH = "/api/groups.list"; - internal const string USERS_LIST_PATH = "/api/users.list"; - private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; - - public RestSharpChannelClient(IRestSharpRequestExecutor restSharpRequestExecutor) - { - _restSharpRequestExecutor = restSharpRequestExecutor; - } - - public async Task JoinDirectMessageChannel(string slackKey, string user) - { - var request = new RestRequest(JOIN_DM_PATH); - request.AddParameter("token", slackKey); - request.AddParameter("user", user); - - var response = await _restSharpRequestExecutor.Execute(request); - return response.Channel; - } - - public async Task GetChannels(string slackKey) - { - var request = new RestRequest(CHANNELS_LIST_PATH); - request.AddParameter("token", slackKey); - - var response = await _restSharpRequestExecutor.Execute(request); - return response.Channels; - } - - public async Task GetGroups(string slackKey) - { - var request = new RestRequest(GROUPS_LIST_PATH); - request.AddParameter("token", slackKey); - - var response = await _restSharpRequestExecutor.Execute(request); - return response.Groups; - } - - public async Task GetUsers(string slackKey) - { - var request = new RestRequest(USERS_LIST_PATH); - request.AddParameter("token", slackKey); - request.AddParameter("presence", "1"); - - var response = await _restSharpRequestExecutor.Execute(request); - return response.Members; - } - } -} \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/Chat/RestSharpChatClient.cs b/src/SlackConnector/Connections/Clients/Chat/RestSharpChatClient.cs deleted file mode 100644 index c6b5da0..0000000 --- a/src/SlackConnector/Connections/Clients/Chat/RestSharpChatClient.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Newtonsoft.Json; -using RestSharp; -using SlackConnector.Connections.Responses; -using SlackConnector.Models; - -namespace SlackConnector.Connections.Clients.Chat -{ - internal class RestSharpChatClient : IChatClient - { - private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; - internal const string SEND_MESSAGE_PATH = "/api/chat.postMessage"; - - public RestSharpChatClient(IRestSharpRequestExecutor restSharpRequestExecutor) - { - _restSharpRequestExecutor = restSharpRequestExecutor; - } - - public async Task PostMessage(string slackKey, string channel, string text, IList attachments) - { - var request = new RestRequest(SEND_MESSAGE_PATH); - request.AddParameter("token", slackKey); - request.AddParameter("channel", channel); - request.AddParameter("text", text); - request.AddParameter("as_user", "true"); - - if (attachments != null && attachments.Any()) - { - request.AddParameter("attachments", JsonConvert.SerializeObject(attachments)); - } - - await _restSharpRequestExecutor.Execute(request); - } - } -} \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/File/RestSharpFileClient.cs b/src/SlackConnector/Connections/Clients/File/RestSharpFileClient.cs deleted file mode 100644 index 5dfc775..0000000 --- a/src/SlackConnector/Connections/Clients/File/RestSharpFileClient.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.IO; -using System.Threading.Tasks; -using RestSharp; -using SlackConnector.Connections.Responses; - -namespace SlackConnector.Connections.Clients.File -{ - internal class RestSharpFileClient : IFileClient - { - private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; - internal const string FILE_UPLOAD_PATH = "/api/files.upload"; - - public RestSharpFileClient(IRestSharpRequestExecutor restSharpRequestExecutor) - { - _restSharpRequestExecutor = restSharpRequestExecutor; - } - - public async Task PostFile(string slackKey, string channel, string file) - { - var request = new RestRequest(FILE_UPLOAD_PATH); - request.AddParameter("token", slackKey); - request.AddParameter("channels", channel); - request.AddParameter("filename", Path.GetFileName(file)); - request.AddFile("file", file); - - await _restSharpRequestExecutor.Execute(request); - } - - public async Task PostFile(string slackKey, string channel, Stream stream, string fileName) - { - var request = new RestRequest(FILE_UPLOAD_PATH); - request.AddParameter("token", slackKey); - request.AddParameter("channels", channel); - request.AddParameter("filename", fileName); - - byte[] data = await ReadByteArray(stream); - request.AddFile("file", data, fileName); - - await _restSharpRequestExecutor.Execute(request); - } - - private async Task ReadByteArray(Stream stream) - { - var memoryStream = stream as MemoryStream; - if (memoryStream != null) - { - return memoryStream.ToArray(); - } - - using (memoryStream = new MemoryStream()) - { - await stream.CopyToAsync(memoryStream); - return memoryStream.ToArray(); - } - } - } -} diff --git a/src/SlackConnector/Connections/Clients/IResponseVerifier.cs b/src/SlackConnector/Connections/Clients/IResponseVerifier.cs index f5fabda..04db6c7 100644 --- a/src/SlackConnector/Connections/Clients/IResponseVerifier.cs +++ b/src/SlackConnector/Connections/Clients/IResponseVerifier.cs @@ -1,11 +1,9 @@ -using RestSharp; -using SlackConnector.Connections.Responses; +using SlackConnector.Connections.Responses; namespace SlackConnector.Connections.Clients { internal interface IResponseVerifier { - T VerifyResponse(IRestResponse response) where T : class; void VerifyResponse(StandardResponse response); } } \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/IRestSharpRequestExecutor.cs b/src/SlackConnector/Connections/Clients/IRestSharpRequestExecutor.cs deleted file mode 100644 index 6b86aba..0000000 --- a/src/SlackConnector/Connections/Clients/IRestSharpRequestExecutor.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Threading.Tasks; -using RestSharp; - -namespace SlackConnector.Connections.Clients -{ - internal interface IRestSharpRequestExecutor - { - Task Execute(IRestRequest request) where T : class; - } -} \ No newline at end of file diff --git a/src/SlackConnector/Connections/Clients/ResponseVerifier.cs b/src/SlackConnector/Connections/Clients/ResponseVerifier.cs index e58e080..9356319 100644 --- a/src/SlackConnector/Connections/Clients/ResponseVerifier.cs +++ b/src/SlackConnector/Connections/Clients/ResponseVerifier.cs @@ -1,6 +1,5 @@ using System.Net; using Newtonsoft.Json; -using RestSharp; using SlackConnector.Connections.Responses; using SlackConnector.Exceptions; @@ -8,22 +7,6 @@ namespace SlackConnector.Connections.Clients { internal class ResponseVerifier : IResponseVerifier { - public T VerifyResponse(IRestResponse response) where T : class - { - if (response.StatusCode != HttpStatusCode.OK) - { - throw new CommunicationException($"Error occured while sending message '{response.StatusCode}'"); - } - - var result = JsonConvert.DeserializeObject(response.Content, typeof(T)) as StandardResponse; - if (!result.Ok) - { - throw new CommunicationException($"Error occured while posting message '{result.Error}'"); - } - - return result as T; - } - public void VerifyResponse(StandardResponse response) { if (!response.Ok) diff --git a/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs b/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs deleted file mode 100644 index 8a981e6..0000000 --- a/src/SlackConnector/Connections/Clients/RestSharpRestSharpRequestExecutor.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; -using RestSharp; - -namespace SlackConnector.Connections.Clients -{ - internal class RestSharpRestSharpRequestExecutor : IRestSharpRequestExecutor - { - internal static string SLACK_URL => ClientConstants.SlackApiHost; - - private readonly IRestSharpFactory _restSharpFactory; - private readonly IResponseVerifier _responseVerifier; - - public RestSharpRestSharpRequestExecutor(IRestSharpFactory restSharpFactory, IResponseVerifier responseVerifier) - { - _restSharpFactory = restSharpFactory; - _responseVerifier = responseVerifier; - } - - public async Task Execute(IRestRequest request) where T : class - { - IRestClient client = _restSharpFactory.CreateClient(SLACK_URL); - IRestResponse response = await client.ExecutePostTaskAsync(request); - return _responseVerifier.VerifyResponse(response); - } - } -} \ No newline at end of file diff --git a/src/SlackConnector/Connections/ConnectionFactory.cs b/src/SlackConnector/Connections/ConnectionFactory.cs index 436e149..6e1e1a4 100644 --- a/src/SlackConnector/Connections/ConnectionFactory.cs +++ b/src/SlackConnector/Connections/ConnectionFactory.cs @@ -11,15 +11,6 @@ namespace SlackConnector.Connections { internal class ConnectionFactory : IConnectionFactory { - private readonly IRestSharpRequestExecutor _restSharpRequestExecutor; - - public ConnectionFactory() - { - IRestSharpFactory restSharpFactory = new RestSharpFactory(); - IResponseVerifier responseVerifier = new ResponseVerifier(); - _restSharpRequestExecutor = new RestSharpRestSharpRequestExecutor(restSharpFactory, responseVerifier); - } - public IWebSocketClient CreateWebSocketClient(string url, ProxySettings proxySettings) { return new WebSocketClient(new MessageInterpreter(new Logger()), url, proxySettings); diff --git a/src/SlackConnector/Connections/IRestSharpFactory.cs b/src/SlackConnector/Connections/IRestSharpFactory.cs deleted file mode 100644 index c43eef3..0000000 --- a/src/SlackConnector/Connections/IRestSharpFactory.cs +++ /dev/null @@ -1,9 +0,0 @@ -using RestSharp; - -namespace SlackConnector.Connections -{ - internal interface IRestSharpFactory - { - IRestClient CreateClient(string baseUrl); - } -} \ No newline at end of file diff --git a/src/SlackConnector/Connections/RestSharpFactory.cs b/src/SlackConnector/Connections/RestSharpFactory.cs deleted file mode 100644 index 1968d8b..0000000 --- a/src/SlackConnector/Connections/RestSharpFactory.cs +++ /dev/null @@ -1,12 +0,0 @@ -using RestSharp; - -namespace SlackConnector.Connections -{ - internal class RestSharpFactory : IRestSharpFactory - { - public IRestClient CreateClient(string baseUrl) - { - return new RestClient(baseUrl); - } - } -} \ No newline at end of file diff --git a/src/SlackConnector/SlackConnector.csproj b/src/SlackConnector/SlackConnector.csproj index 8c11ffa..52a86b0 100644 --- a/src/SlackConnector/SlackConnector.csproj +++ b/src/SlackConnector/SlackConnector.csproj @@ -48,10 +48,6 @@ ..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True - - ..\..\packages\RestSharp.105.2.3\lib\net46\RestSharp.dll - True - @@ -114,17 +110,12 @@ - - - - - @@ -134,10 +125,8 @@ - - diff --git a/src/SlackConnector/packages.config b/src/SlackConnector/packages.config index adabc76..f212dae 100644 --- a/src/SlackConnector/packages.config +++ b/src/SlackConnector/packages.config @@ -4,7 +4,6 @@ -