consolidate test projects
This commit is contained in:
Родитель
b56895b262
Коммит
3c90081287
|
@ -24,8 +24,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Connector", "
|
|||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Schema", "libraries\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj", "{C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Core", "libraries\Microsoft.Bot.Builder.Core\Microsoft.Bot.Builder.Core.csproj", "{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder", "libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj", "{ADA8AB8B-2066-4193-B8F7-985669B23E00}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Samples.EchoBot-Console", "samples\Microsoft.Bot.Samples.EchoBot-Console\Microsoft.Bot.Samples.EchoBot-Console.csproj", "{C8DF8AE3-0A4D-445D-993E-F7A1784BFDD4}"
|
||||
|
@ -50,12 +48,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.Samples.EchoB
|
|||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Samples.Connector.EchoBot", "samples\Microsoft.Bot.Samples.Connector.EchoBot\Microsoft.Bot.Samples.Connector.EchoBot.csproj", "{8D6F4046-0971-4E24-8E4D-F8175C6DFF2B}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Core.Extensions", "libraries\Microsoft.Bot.Builder.Core.Extensions\Microsoft.Bot.Builder.Core.Extensions.csproj", "{183B3324-4CFF-477A-8EAE-73953D3E383D}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Core.Tests", "tests\Microsoft.Bot.Builder.Core.Tests\Microsoft.Bot.Builder.Core.Tests.csproj", "{99100609-26D5-4BBD-ACD7-4CC810977A06}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Core.Extensions.Tests", "tests\Microsoft.Bot.Builder.Core.Extensions.Tests\Microsoft.Bot.Builder.Core.Extensions.Tests.csproj", "{6034B365-C87B-4A90-A8C7-F24374BFE2E7}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TemplateManager", "libraries\Microsoft.Bot.Builder.TemplateManager\Microsoft.Bot.Builder.TemplateManager.csproj", "{EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TemplateManager.Tests", "tests\Microsoft.Bot.Builder.TemplateManager\Microsoft.Bot.Builder.TemplateManager.Tests.csproj", "{C93F6192-0123-4121-AD92-374A71E4B0F3}"
|
||||
|
@ -98,6 +90,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integ
|
|||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests", "tests\integration\Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests\Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests.csproj", "{2614D290-1345-4A41-BE90-F85F817CEADE}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Tests", "tests\Microsoft.Bot.Builder.Tests\Microsoft.Bot.Builder.Tests.csproj", "{35F9B8A8-1974-4795-930B-5E4980EE85E5}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug - NuGet Packages|Any CPU = Debug - NuGet Packages|Any CPU
|
||||
|
@ -166,14 +160,6 @@ Global
|
|||
{C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Documentation|Any CPU.Build.0 = Documentation|Any CPU
|
||||
{C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Debug - NuGet Packages|Any CPU.ActiveCfg = Debug - NuGet Packages|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Debug - NuGet Packages|Any CPU.Build.0 = Debug - NuGet Packages|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Documentation|Any CPU.ActiveCfg = Documentation|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Documentation|Any CPU.Build.0 = Documentation|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug - NuGet Packages|Any CPU.ActiveCfg = Debug - NuGet Packages|Any CPU
|
||||
{ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug - NuGet Packages|Any CPU.Build.0 = Debug - NuGet Packages|Any CPU
|
||||
{ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
|
@ -255,28 +241,6 @@ Global
|
|||
{8D6F4046-0971-4E24-8E4D-F8175C6DFF2B}.Documentation|Any CPU.ActiveCfg = Documentation|Any CPU
|
||||
{8D6F4046-0971-4E24-8E4D-F8175C6DFF2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8D6F4046-0971-4E24-8E4D-F8175C6DFF2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Debug - NuGet Packages|Any CPU.ActiveCfg = Debug - NuGet Packages|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Debug - NuGet Packages|Any CPU.Build.0 = Debug - NuGet Packages|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Documentation|Any CPU.ActiveCfg = Documentation|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Documentation|Any CPU.Build.0 = Documentation|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06}.Debug - NuGet Packages|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06}.Debug - NuGet Packages|Any CPU.Build.0 = Debug|Any CPU
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06}.Documentation|Any CPU.ActiveCfg = Documentation|Any CPU
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7}.Debug - NuGet Packages|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7}.Debug - NuGet Packages|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7}.Documentation|Any CPU.ActiveCfg = Documentation|Any CPU
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug - NuGet Packages|Any CPU.ActiveCfg = Debug - NuGet Packages|Any CPU
|
||||
{EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug - NuGet Packages|Any CPU.Build.0 = Debug - NuGet Packages|Any CPU
|
||||
{EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
|
@ -412,6 +376,14 @@ Global
|
|||
{2614D290-1345-4A41-BE90-F85F817CEADE}.Documentation|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2614D290-1345-4A41-BE90-F85F817CEADE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2614D290-1345-4A41-BE90-F85F817CEADE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug - NuGet Packages|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug - NuGet Packages|Any CPU.Build.0 = Debug|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Documentation|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Documentation|Any CPU.Build.0 = Debug|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -425,7 +397,6 @@ Global
|
|||
{3B5BFCCB-23CF-4849-8B2C-74D05DC3E402} = {3ADFB27A-95FA-4330-B211-1D66A29A17AB}
|
||||
{6462DA5D-27DC-4CD5-9467-5EFB998FD838} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
|
||||
{C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
|
||||
{F0C150E2-9B8A-444C-B70E-97AD918CB3D4} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
|
||||
{ADA8AB8B-2066-4193-B8F7-985669B23E00} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
|
||||
{C8DF8AE3-0A4D-445D-993E-F7A1784BFDD4} = {3ADFB27A-95FA-4330-B211-1D66A29A17AB}
|
||||
{BF414C86-DB3B-4022-9B29-DCE8AA954C12} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
|
||||
|
@ -438,9 +409,6 @@ Global
|
|||
{BEDBA9E2-FE6E-44D9-914D-03AE63EF6768} = {3ADFB27A-95FA-4330-B211-1D66A29A17AB}
|
||||
{AAC0F76C-4114-4D64-A99E-8BE4C43982F9} = {3ADFB27A-95FA-4330-B211-1D66A29A17AB}
|
||||
{8D6F4046-0971-4E24-8E4D-F8175C6DFF2B} = {3ADFB27A-95FA-4330-B211-1D66A29A17AB}
|
||||
{183B3324-4CFF-477A-8EAE-73953D3E383D} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
|
||||
{99100609-26D5-4BBD-ACD7-4CC810977A06} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
|
||||
{6034B365-C87B-4A90-A8C7-F24374BFE2E7} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
|
||||
{EED5F0D3-6F00-4ED1-9108-5ADCB10A3734} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
|
||||
{C93F6192-0123-4121-AD92-374A71E4B0F3} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
|
||||
{2A46FEEF-4FD9-4DD5-8650-39C36CFDF2BB} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
|
||||
|
@ -462,6 +430,7 @@ Global
|
|||
{0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
|
||||
{62C4DC83-3B07-45D7-856E-224FFB368E5F} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8}
|
||||
{2614D290-1345-4A41-BE90-F85F817CEADE} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8}
|
||||
{35F9B8A8-1974-4795-930B-5E4980EE85E5} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {7173C9F3-A7F9-496E-9078-9156E35D6E16}
|
||||
|
|
|
@ -1,75 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">4.0.0-local</Version>
|
||||
<Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(BUILD_BUILDNUMBER)</Version>
|
||||
<PackageVersion Condition=" '$(PackageVersion)' == '' ">4.0.0-local</PackageVersion>
|
||||
<PackageVersion Condition=" '$(PackageVersion)' != '' ">$(PackageVersion)</PackageVersion>
|
||||
<Configurations>Debug;Release;Documentation;Debug - NuGet Packages;</Configurations>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<DelaySign>true</DelaySign>
|
||||
<AssemblyOriginatorKeyFile>..\..\build\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<PackageId>Microsoft.Bot.Builder.Core.Extensions</PackageId>
|
||||
<Description>This library implements extensions for building bots using the Microsoft Bot Builder.</Description>
|
||||
<Summary>This library implements extensions for building bots using the Microsoft Bot Builder.</Summary>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<Company>Microsoft</Company>
|
||||
<Authors>microsoft,BotFramework,nugetbotbuilder</Authors>
|
||||
<Product>Microsoft Bot Builder SDK</Product>
|
||||
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
|
||||
<PackageProjectUrl>https://github.com/Microsoft/botbuilder-dotnet</PackageProjectUrl>
|
||||
<PackageIconUrl>http://docs.botframework.com/images/bot_icon.png</PackageIconUrl>
|
||||
<PackageLicenseUrl>https://github.com/Microsoft/BotBuilder/blob/master/LICENSE</PackageLicenseUrl>
|
||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
||||
<RepositoryUrl>https://github.com/Microsoft/botbuilder-dotnet</RepositoryUrl>
|
||||
<LicenseUrl>https://github.com/Microsoft/BotBuilder-dotnet/blob/master/LICENSE</LicenseUrl>
|
||||
<RepositoryType />
|
||||
<PackageTags>bots;ai;botframework;botbuilder</PackageTags>
|
||||
<NeutralLanguage />
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="$(Configuration) == 'Debug - NuGet Packages'">
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998;</NoWarn>
|
||||
<DocumentationFile></DocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Documentation|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998;</NoWarn>
|
||||
<DocumentationFile>bin\$(Configuration)\netstandard2.0\Microsoft.Bot.Builder.Core.Extensions.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998;</NoWarn>
|
||||
<DocumentationFile>bin\$(Configuration)\netstandard2.0\Microsoft.Bot.Builder.Core.Extensions.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CSharp" Version="4.4.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
||||
<PackageReference Include="Microsoft.Bot.Schema" Condition=" '$(PackageVersion)' == '' " Version="4.0.0-local" />
|
||||
<PackageReference Include="Microsoft.Bot.Schema" Condition=" '$(PackageVersion)' != '' " Version="$(PackageVersion)" />
|
||||
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Core\Microsoft.Bot.Builder.Core.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,76 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">4.0.0-local</Version>
|
||||
<Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(BUILD_BUILDNUMBER)</Version>
|
||||
<PackageVersion Condition=" '$(PackageVersion)' == '' ">4.0.0-local</PackageVersion>
|
||||
<PackageVersion Condition=" '$(PackageVersion)' != '' ">$(PackageVersion)</PackageVersion>
|
||||
<Configurations>Debug;Release;Documentation;Debug - NuGet Packages;</Configurations>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<DelaySign>true</DelaySign>
|
||||
<AssemblyOriginatorKeyFile>..\..\build\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<PackageId>Microsoft.Bot.Builder.Core</PackageId>
|
||||
<Description>This library implements core C# classes for building bots using the Microsoft Bot Builder.</Description>
|
||||
<Summary>This library implements core C# classes for building bots using the Microsoft Bot Builder.</Summary>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<Company>Microsoft</Company>
|
||||
<Authors>microsoft,BotFramework,nugetbotbuilder</Authors>
|
||||
<Product>Microsoft Bot Builder SDK</Product>
|
||||
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
|
||||
<PackageProjectUrl>https://github.com/Microsoft/botbuilder-dotnet</PackageProjectUrl>
|
||||
<PackageIconUrl>http://docs.botframework.com/images/bot_icon.png</PackageIconUrl>
|
||||
<PackageLicenseUrl>https://github.com/Microsoft/BotBuilder/blob/master/LICENSE</PackageLicenseUrl>
|
||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
||||
<RepositoryUrl>https://github.com/Microsoft/botbuilder-dotnet</RepositoryUrl>
|
||||
<LicenseUrl>https://github.com/Microsoft/BotBuilder-dotnet/blob/master/LICENSE</LicenseUrl>
|
||||
<RepositoryType />
|
||||
<PackageTags>bots;ai;botframework;botbuilder</PackageTags>
|
||||
<NeutralLanguage />
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="$(Configuration) == 'Debug - NuGet Packages'">
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998;</NoWarn>
|
||||
<DocumentationFile></DocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Documentation|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998;</NoWarn>
|
||||
<DocumentationFile>bin\$(Configuration)\netstandard2.0\Microsoft.Bot.Builder.Core.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998;</NoWarn>
|
||||
<DocumentationFile>bin\$(Configuration)\netstandard2.0\Microsoft.Bot.Builder.Core.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
||||
<PackageReference Include="Microsoft.Bot.Schema" Condition=" '$(PackageVersion)' == '' " Version="4.0.0-local" />
|
||||
<PackageReference Include="Microsoft.Bot.Schema" Condition=" '$(PackageVersion)' != '' " Version="$(PackageVersion)" />
|
||||
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Microsoft.Bot.Connector\Microsoft.Bot.Connector.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -115,10 +115,6 @@
|
|||
<Project>{12cae029-7b8d-4928-8504-28746c36adb3}</Project>
|
||||
<Name>RView</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Core\Microsoft.Bot.Builder.Core.csproj">
|
||||
<Project>{f0c150e2-9b8a-444c-b70e-97ad918cb3d4}</Project>
|
||||
<Name>Microsoft.Bot.Builder.Core</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj">
|
||||
<Project>{ada8ab8b-2066-4193-b8f7-985669b23e00}</Project>
|
||||
<Name>Microsoft.Bot.Builder</Name>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Ai.LUIS\Microsoft.Bot.Builder.Ai.LUIS.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Core.Extensions.Tests\Microsoft.Bot.Builder.Core.Extensions.Tests.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Tests\Microsoft.Bot.Builder.Tests.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Ai.Translation\Microsoft.Bot.Builder.Ai.Translation.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Azure\Microsoft.Bot.Builder.Azure.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Core.Extensions.Tests\Microsoft.Bot.Builder.Core.Extensions.Tests.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Tests\Microsoft.Bot.Builder.Tests.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Ai.Translation\Microsoft.Bot.Builder.Ai.Translation.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Azure\Microsoft.Bot.Builder.Azure.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Core.Extensions.Tests\Microsoft.Bot.Builder.Core.Extensions.Tests.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Tests\Microsoft.Bot.Builder.Tests.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Azure\Microsoft.Bot.Builder.Azure.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Core.Extensions.Tests\Microsoft.Bot.Builder.Core.Extensions.Tests.csproj" />
|
||||
<ProjectReference Include="..\Microsoft.Bot.Builder.Tests\Microsoft.Bot.Builder.Tests.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Classic\Microsoft.Bot.Builder.Classic\Microsoft.Bot.Builder.Classic.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder.Core\Microsoft.Bot.Builder.Core.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Connector\Microsoft.Bot.Connector.csproj" />
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj" />
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
<IsPackable>false</IsPackable>
|
||||
<Configurations>Debug;Release;Documentation</Configurations>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Documentation|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.0" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="1.2.1" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="1.2.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,35 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
<IsPackable>false</IsPackable>
|
||||
<Configurations>Debug;Release;Documentation</Configurations>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Documentation|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<NoWarn>1701;1702;1705;1998</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.0" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="1.2.1" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="1.2.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -3,7 +3,7 @@ using System.Threading.Tasks;
|
|||
using Microsoft.Bot.Builder.Adapters;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Tests
|
||||
namespace Microsoft.Bot.Builder.Tests
|
||||
{
|
||||
[TestClass]
|
||||
[TestCategory("Middleware")]
|
|
@ -5,7 +5,7 @@ using System.Threading.Tasks;
|
|||
using Microsoft.Bot.Schema;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Tests
|
||||
namespace Microsoft.Bot.Builder.Tests
|
||||
{
|
||||
[TestClass]
|
||||
[TestCategory("BotAdapter")]
|
|
@ -0,0 +1,19 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -2,7 +2,7 @@
|
|||
using System.Threading.Tasks;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Tests
|
||||
namespace Microsoft.Bot.Builder.Tests
|
||||
{
|
||||
[TestClass]
|
||||
[TestCategory("Russian Doll Middleware, Nested Middleware sets")]
|
|
@ -5,7 +5,7 @@ using System.Threading.Tasks;
|
|||
using Microsoft.Bot.Schema;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Tests
|
||||
namespace Microsoft.Bot.Builder.Tests
|
||||
{
|
||||
public class SimpleAdapter : BotAdapter
|
||||
{
|
|
@ -1,271 +1,271 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Extensions.Tests
|
||||
{
|
||||
public class StorageBaseTests
|
||||
{
|
||||
protected async Task _readUnknownTest(IStorage storage)
|
||||
{
|
||||
var result = await storage.Read(new[] { "unknown" });
|
||||
Assert.IsNotNull(result, "result should not be null");
|
||||
Assert.IsNull(result.FirstOrDefault(e => e.Key == "unknown").Value, "\"unknown\" key should have returned no value");
|
||||
}
|
||||
|
||||
protected async Task _createObjectTest(IStorage storage)
|
||||
{
|
||||
var storeItems = new Dictionary<string, object>
|
||||
{
|
||||
["createPoco"] = new PocoItem() { Id = "1" },
|
||||
["createPocoStoreItem"] = new PocoStoreItem() { Id = "2" },
|
||||
};
|
||||
|
||||
await storage.Write(storeItems);
|
||||
|
||||
var readStoreItems = new Dictionary<string, object>(await storage.Read(storeItems.Keys.ToArray()));
|
||||
|
||||
Assert.IsInstanceOfType(readStoreItems["createPoco"], typeof(PocoItem));
|
||||
Assert.IsInstanceOfType(readStoreItems["createPocoStoreItem"], typeof(PocoStoreItem));
|
||||
|
||||
var createPoco = readStoreItems["createPoco"] as PocoItem;
|
||||
|
||||
Assert.IsNotNull(createPoco, "createPoco should not be null");
|
||||
Assert.AreEqual(createPoco.Id, "1", "createPoco.id should be 1");
|
||||
|
||||
var createPocoStoreItem = readStoreItems["createPocoStoreItem"] as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(createPocoStoreItem, "createPocoStoreItem should not be null");
|
||||
Assert.AreEqual(createPocoStoreItem.Id, "2", "createPocoStoreItem.id should be 2");
|
||||
Assert.IsNotNull(createPocoStoreItem.eTag, "createPocoStoreItem.eTag should not be null");
|
||||
}
|
||||
|
||||
protected async Task _handleCrazyKeys(IStorage storage)
|
||||
{
|
||||
var key = "!@#$%^&*()~/\\><,.?';\"`~";
|
||||
var storeItem = new PocoStoreItem() { Id = "1" };
|
||||
|
||||
var dict = new Dictionary<string, object>() { { key, storeItem } };
|
||||
|
||||
await storage.Write(dict);
|
||||
|
||||
var storeItems = await storage.Read(key);
|
||||
|
||||
storeItem = storeItems.FirstOrDefault(si => si.Key == key).Value as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(storeItem);
|
||||
Assert.AreEqual("1", storeItem.Id);
|
||||
}
|
||||
|
||||
public class TypedObject
|
||||
{
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
protected async Task _updateObjectTest(IStorage storage)
|
||||
{
|
||||
var originalPocoItem = new PocoItem() { Id = "1", Count = 1 };
|
||||
var originalPocoStoreItem = new PocoStoreItem() { Id = "1", Count = 1 };
|
||||
|
||||
// first write should work
|
||||
var dict = new Dictionary<string, object>()
|
||||
{
|
||||
{ "pocoItem", originalPocoItem },
|
||||
{ "pocoStoreItem", originalPocoStoreItem }
|
||||
};
|
||||
|
||||
await storage.Write(dict);
|
||||
|
||||
var loadedStoreItems = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
var updatePocoItem = loadedStoreItems["pocoItem"] as PocoItem;
|
||||
var updatePocoStoreItem = loadedStoreItems["pocoStoreItem"] as PocoStoreItem;
|
||||
Assert.IsNotNull(updatePocoStoreItem.eTag, "updatePocoItem.eTag should not be null");
|
||||
|
||||
// 2nd write should work, because we have new etag, or no etag
|
||||
updatePocoItem.Count++;
|
||||
updatePocoStoreItem.Count++;
|
||||
|
||||
await storage.Write(loadedStoreItems);
|
||||
|
||||
var reloadedStoreItems = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
var reloeadedUpdatePocoItem = reloadedStoreItems["pocoItem"] as PocoItem;
|
||||
var reloadedUpdatePocoStoreItem = reloadedStoreItems["pocoStoreItem"] as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(reloadedUpdatePocoStoreItem.eTag, "updatePocoItem.eTag should not be null");
|
||||
Assert.AreNotEqual(updatePocoStoreItem.eTag, reloadedUpdatePocoStoreItem.eTag, "updatePocoItem.eTag should not be different");
|
||||
Assert.AreEqual(2, reloeadedUpdatePocoItem.Count, "updatePocoItem.Count should be 2");
|
||||
Assert.AreEqual(2, reloadedUpdatePocoStoreItem.Count, "updatePocoStoreItem.Count should be 2");
|
||||
|
||||
// write with old etag should succeed for non-storeitem
|
||||
try
|
||||
{
|
||||
updatePocoItem.Count = 123;
|
||||
|
||||
await storage.Write(
|
||||
new Dictionary<string, object>() { { "pocoItem", updatePocoItem } }
|
||||
);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Assert.Fail("Should not throw exception on write with pocoItem");
|
||||
}
|
||||
|
||||
// write with old etag should FAIL for storeitem
|
||||
try
|
||||
{
|
||||
updatePocoStoreItem.Count = 123;
|
||||
|
||||
await storage.Write(
|
||||
new Dictionary<string, object>() { { "pocoStoreItem", updatePocoStoreItem } }
|
||||
);
|
||||
|
||||
Assert.Fail("Should have thrown exception on write with store item because of old etag");
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
var reloadedStoreItems2 = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
var reloadedPocoItem2 = reloadedStoreItems2["pocoItem"] as PocoItem;
|
||||
var reloadedPocoStoreItem2 = reloadedStoreItems2["pocoStoreItem"] as PocoStoreItem;
|
||||
|
||||
Assert.AreEqual(123, reloadedPocoItem2.Count);
|
||||
Assert.AreEqual(2, reloadedPocoStoreItem2.Count);
|
||||
|
||||
// write with wildcard etag should work
|
||||
reloadedPocoItem2.Count = 100;
|
||||
reloadedPocoStoreItem2.Count = 100;
|
||||
reloadedPocoStoreItem2.eTag = "*";
|
||||
|
||||
var wildcardEtagedict = new Dictionary<string, object>() {
|
||||
{ "pocoItem", reloadedPocoItem2 },
|
||||
{ "pocoStoreItem", reloadedPocoStoreItem2 }
|
||||
};
|
||||
|
||||
await storage.Write(wildcardEtagedict);
|
||||
|
||||
var reloadedStoreItems3 = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
Assert.AreEqual(100, (reloadedStoreItems3["pocoItem"] as PocoItem).Count);
|
||||
Assert.AreEqual(100, (reloadedStoreItems3["pocoStoreItem"] as PocoStoreItem).Count);
|
||||
|
||||
// write with empty etag should not work
|
||||
try
|
||||
{
|
||||
var reloadedStoreItem4 = (await storage.Read("pocoStoreItem")).OfType<PocoStoreItem>().First();
|
||||
|
||||
reloadedStoreItem4.eTag = "";
|
||||
var dict2 = new Dictionary<string, object>()
|
||||
{
|
||||
{ "pocoStoreItem", reloadedStoreItem4 }
|
||||
};
|
||||
|
||||
|
||||
await storage.Write(dict2);
|
||||
|
||||
Assert.Fail("Should have thrown exception on write with storeitem because of empty etag");
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
var finalStoreItems = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
Assert.AreEqual(100, (finalStoreItems["pocoItem"] as PocoItem).Count);
|
||||
Assert.AreEqual(100, (finalStoreItems["pocoStoreItem"] as PocoStoreItem).Count);
|
||||
}
|
||||
|
||||
protected async Task _deleteObjectTest(IStorage storage)
|
||||
{
|
||||
//first write should work
|
||||
var dict = new Dictionary<string, object>()
|
||||
{
|
||||
{ "delete1", new PocoStoreItem() { Id = "1", Count = 1 } }
|
||||
};
|
||||
|
||||
await storage.Write(dict);
|
||||
|
||||
var storeItems = await storage.Read("delete1");
|
||||
var storeItem = storeItems.First().Value as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(storeItem.eTag, "etag should be set");
|
||||
Assert.AreEqual(1, storeItem.Count);
|
||||
|
||||
await storage.Delete("delete1");
|
||||
|
||||
var reloadedStoreItems = await storage.Read("delete1");
|
||||
|
||||
Assert.IsFalse(reloadedStoreItems.Any(), "no store item should have been found because it was deleted");
|
||||
}
|
||||
|
||||
protected async Task _deleteUnknownObjectTest(IStorage storage)
|
||||
{
|
||||
await storage.Delete("unknown_key");
|
||||
}
|
||||
|
||||
protected async Task _batchCreateObjectTest(IStorage storage, long minimumExtraBytes = 0)
|
||||
{
|
||||
string[] stringArray = null;
|
||||
|
||||
if (minimumExtraBytes > 0)
|
||||
{
|
||||
// chunks of maximum string size to fill the extra bytes request
|
||||
var extraStringCount = (int)(minimumExtraBytes / int.MaxValue);
|
||||
stringArray = Enumerable.Range(0, extraStringCount).Select(i => new string('X', int.MaxValue / 2)).ToArray();
|
||||
|
||||
// Append the remaining string size
|
||||
stringArray = stringArray.Append(new string('X', (int)(minimumExtraBytes % int.MaxValue) / 2)).ToArray();
|
||||
}
|
||||
|
||||
var storeItemsList = new List<Dictionary<string, object>>(new[]
|
||||
{
|
||||
new Dictionary<string, object> {["createPoco"] = new PocoItem() { Id = "1", Count = 0, ExtraBytes = stringArray }},
|
||||
new Dictionary<string, object> {["createPoco"] = new PocoItem() { Id = "1", Count = 1, ExtraBytes = stringArray }},
|
||||
new Dictionary<string, object> {["createPoco"] = new PocoItem() { Id = "1", Count = 2, ExtraBytes = stringArray }}
|
||||
});
|
||||
|
||||
// Writing large objects in parallel might raise a Microsoft.Bot.Builder.Core.Extensions.StorageException
|
||||
try
|
||||
{
|
||||
await Task.WhenAll(
|
||||
storeItemsList.Select(storeItems =>
|
||||
Task.Run(async () => await storage.Write(storeItems))));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Assert.IsInstanceOfType(ex, typeof(BotStorageException));
|
||||
}
|
||||
|
||||
var readStoreItems = new Dictionary<string, object>(await storage.Read("createPoco"));
|
||||
Assert.IsInstanceOfType(readStoreItems["createPoco"], typeof(PocoItem));
|
||||
var createPoco = readStoreItems["createPoco"] as PocoItem;
|
||||
Assert.AreEqual(createPoco.Id, "1", "createPoco.id should be 1");
|
||||
}
|
||||
}
|
||||
|
||||
public class PocoItem
|
||||
{
|
||||
public string Id { get; set; }
|
||||
|
||||
public int Count { get; set; }
|
||||
|
||||
public string[] ExtraBytes { get; set; }
|
||||
}
|
||||
|
||||
public class PocoStoreItem : IStoreItem
|
||||
{
|
||||
public string eTag { get; set; }
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public int Count { get; set; }
|
||||
}
|
||||
}
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Extensions.Tests
|
||||
{
|
||||
public class StorageBaseTests
|
||||
{
|
||||
protected async Task _readUnknownTest(IStorage storage)
|
||||
{
|
||||
var result = await storage.Read(new[] { "unknown" });
|
||||
Assert.IsNotNull(result, "result should not be null");
|
||||
Assert.IsNull(result.FirstOrDefault(e => e.Key == "unknown").Value, "\"unknown\" key should have returned no value");
|
||||
}
|
||||
|
||||
protected async Task _createObjectTest(IStorage storage)
|
||||
{
|
||||
var storeItems = new Dictionary<string, object>
|
||||
{
|
||||
["createPoco"] = new PocoItem() { Id = "1" },
|
||||
["createPocoStoreItem"] = new PocoStoreItem() { Id = "2" },
|
||||
};
|
||||
|
||||
await storage.Write(storeItems);
|
||||
|
||||
var readStoreItems = new Dictionary<string, object>(await storage.Read(storeItems.Keys.ToArray()));
|
||||
|
||||
Assert.IsInstanceOfType(readStoreItems["createPoco"], typeof(PocoItem));
|
||||
Assert.IsInstanceOfType(readStoreItems["createPocoStoreItem"], typeof(PocoStoreItem));
|
||||
|
||||
var createPoco = readStoreItems["createPoco"] as PocoItem;
|
||||
|
||||
Assert.IsNotNull(createPoco, "createPoco should not be null");
|
||||
Assert.AreEqual(createPoco.Id, "1", "createPoco.id should be 1");
|
||||
|
||||
var createPocoStoreItem = readStoreItems["createPocoStoreItem"] as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(createPocoStoreItem, "createPocoStoreItem should not be null");
|
||||
Assert.AreEqual(createPocoStoreItem.Id, "2", "createPocoStoreItem.id should be 2");
|
||||
Assert.IsNotNull(createPocoStoreItem.eTag, "createPocoStoreItem.eTag should not be null");
|
||||
}
|
||||
|
||||
protected async Task _handleCrazyKeys(IStorage storage)
|
||||
{
|
||||
var key = "!@#$%^&*()~/\\><,.?';\"`~";
|
||||
var storeItem = new PocoStoreItem() { Id = "1" };
|
||||
|
||||
var dict = new Dictionary<string, object>() { { key, storeItem } };
|
||||
|
||||
await storage.Write(dict);
|
||||
|
||||
var storeItems = await storage.Read(key);
|
||||
|
||||
storeItem = storeItems.FirstOrDefault(si => si.Key == key).Value as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(storeItem);
|
||||
Assert.AreEqual("1", storeItem.Id);
|
||||
}
|
||||
|
||||
public class TypedObject
|
||||
{
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
protected async Task _updateObjectTest(IStorage storage)
|
||||
{
|
||||
var originalPocoItem = new PocoItem() { Id = "1", Count = 1 };
|
||||
var originalPocoStoreItem = new PocoStoreItem() { Id = "1", Count = 1 };
|
||||
|
||||
// first write should work
|
||||
var dict = new Dictionary<string, object>()
|
||||
{
|
||||
{ "pocoItem", originalPocoItem },
|
||||
{ "pocoStoreItem", originalPocoStoreItem }
|
||||
};
|
||||
|
||||
await storage.Write(dict);
|
||||
|
||||
var loadedStoreItems = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
var updatePocoItem = loadedStoreItems["pocoItem"] as PocoItem;
|
||||
var updatePocoStoreItem = loadedStoreItems["pocoStoreItem"] as PocoStoreItem;
|
||||
Assert.IsNotNull(updatePocoStoreItem.eTag, "updatePocoItem.eTag should not be null");
|
||||
|
||||
// 2nd write should work, because we have new etag, or no etag
|
||||
updatePocoItem.Count++;
|
||||
updatePocoStoreItem.Count++;
|
||||
|
||||
await storage.Write(loadedStoreItems);
|
||||
|
||||
var reloadedStoreItems = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
var reloeadedUpdatePocoItem = reloadedStoreItems["pocoItem"] as PocoItem;
|
||||
var reloadedUpdatePocoStoreItem = reloadedStoreItems["pocoStoreItem"] as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(reloadedUpdatePocoStoreItem.eTag, "updatePocoItem.eTag should not be null");
|
||||
Assert.AreNotEqual(updatePocoStoreItem.eTag, reloadedUpdatePocoStoreItem.eTag, "updatePocoItem.eTag should not be different");
|
||||
Assert.AreEqual(2, reloeadedUpdatePocoItem.Count, "updatePocoItem.Count should be 2");
|
||||
Assert.AreEqual(2, reloadedUpdatePocoStoreItem.Count, "updatePocoStoreItem.Count should be 2");
|
||||
|
||||
// write with old etag should succeed for non-storeitem
|
||||
try
|
||||
{
|
||||
updatePocoItem.Count = 123;
|
||||
|
||||
await storage.Write(
|
||||
new Dictionary<string, object>() { { "pocoItem", updatePocoItem } }
|
||||
);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Assert.Fail("Should not throw exception on write with pocoItem");
|
||||
}
|
||||
|
||||
// write with old etag should FAIL for storeitem
|
||||
try
|
||||
{
|
||||
updatePocoStoreItem.Count = 123;
|
||||
|
||||
await storage.Write(
|
||||
new Dictionary<string, object>() { { "pocoStoreItem", updatePocoStoreItem } }
|
||||
);
|
||||
|
||||
Assert.Fail("Should have thrown exception on write with store item because of old etag");
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
var reloadedStoreItems2 = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
var reloadedPocoItem2 = reloadedStoreItems2["pocoItem"] as PocoItem;
|
||||
var reloadedPocoStoreItem2 = reloadedStoreItems2["pocoStoreItem"] as PocoStoreItem;
|
||||
|
||||
Assert.AreEqual(123, reloadedPocoItem2.Count);
|
||||
Assert.AreEqual(2, reloadedPocoStoreItem2.Count);
|
||||
|
||||
// write with wildcard etag should work
|
||||
reloadedPocoItem2.Count = 100;
|
||||
reloadedPocoStoreItem2.Count = 100;
|
||||
reloadedPocoStoreItem2.eTag = "*";
|
||||
|
||||
var wildcardEtagedict = new Dictionary<string, object>() {
|
||||
{ "pocoItem", reloadedPocoItem2 },
|
||||
{ "pocoStoreItem", reloadedPocoStoreItem2 }
|
||||
};
|
||||
|
||||
await storage.Write(wildcardEtagedict);
|
||||
|
||||
var reloadedStoreItems3 = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
|
||||
Assert.AreEqual(100, (reloadedStoreItems3["pocoItem"] as PocoItem).Count);
|
||||
Assert.AreEqual(100, (reloadedStoreItems3["pocoStoreItem"] as PocoStoreItem).Count);
|
||||
|
||||
// write with empty etag should not work
|
||||
try
|
||||
{
|
||||
var reloadedStoreItem4 = (await storage.Read("pocoStoreItem")).OfType<PocoStoreItem>().First();
|
||||
|
||||
reloadedStoreItem4.eTag = "";
|
||||
var dict2 = new Dictionary<string, object>()
|
||||
{
|
||||
{ "pocoStoreItem", reloadedStoreItem4 }
|
||||
};
|
||||
|
||||
|
||||
await storage.Write(dict2);
|
||||
|
||||
Assert.Fail("Should have thrown exception on write with storeitem because of empty etag");
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
var finalStoreItems = new Dictionary<string, object>(await storage.Read("pocoItem", "pocoStoreItem"));
|
||||
Assert.AreEqual(100, (finalStoreItems["pocoItem"] as PocoItem).Count);
|
||||
Assert.AreEqual(100, (finalStoreItems["pocoStoreItem"] as PocoStoreItem).Count);
|
||||
}
|
||||
|
||||
protected async Task _deleteObjectTest(IStorage storage)
|
||||
{
|
||||
//first write should work
|
||||
var dict = new Dictionary<string, object>()
|
||||
{
|
||||
{ "delete1", new PocoStoreItem() { Id = "1", Count = 1 } }
|
||||
};
|
||||
|
||||
await storage.Write(dict);
|
||||
|
||||
var storeItems = await storage.Read("delete1");
|
||||
var storeItem = storeItems.First().Value as PocoStoreItem;
|
||||
|
||||
Assert.IsNotNull(storeItem.eTag, "etag should be set");
|
||||
Assert.AreEqual(1, storeItem.Count);
|
||||
|
||||
await storage.Delete("delete1");
|
||||
|
||||
var reloadedStoreItems = await storage.Read("delete1");
|
||||
|
||||
Assert.IsFalse(reloadedStoreItems.Any(), "no store item should have been found because it was deleted");
|
||||
}
|
||||
|
||||
protected async Task _deleteUnknownObjectTest(IStorage storage)
|
||||
{
|
||||
await storage.Delete("unknown_key");
|
||||
}
|
||||
|
||||
protected async Task _batchCreateObjectTest(IStorage storage, long minimumExtraBytes = 0)
|
||||
{
|
||||
string[] stringArray = null;
|
||||
|
||||
if (minimumExtraBytes > 0)
|
||||
{
|
||||
// chunks of maximum string size to fill the extra bytes request
|
||||
var extraStringCount = (int)(minimumExtraBytes / int.MaxValue);
|
||||
stringArray = Enumerable.Range(0, extraStringCount).Select(i => new string('X', int.MaxValue / 2)).ToArray();
|
||||
|
||||
// Append the remaining string size
|
||||
stringArray = stringArray.Append(new string('X', (int)(minimumExtraBytes % int.MaxValue) / 2)).ToArray();
|
||||
}
|
||||
|
||||
var storeItemsList = new List<Dictionary<string, object>>(new[]
|
||||
{
|
||||
new Dictionary<string, object> {["createPoco"] = new PocoItem() { Id = "1", Count = 0, ExtraBytes = stringArray }},
|
||||
new Dictionary<string, object> {["createPoco"] = new PocoItem() { Id = "1", Count = 1, ExtraBytes = stringArray }},
|
||||
new Dictionary<string, object> {["createPoco"] = new PocoItem() { Id = "1", Count = 2, ExtraBytes = stringArray }}
|
||||
});
|
||||
|
||||
// Writing large objects in parallel might raise a Microsoft.Bot.Builder.Core.Extensions.StorageException
|
||||
try
|
||||
{
|
||||
await Task.WhenAll(
|
||||
storeItemsList.Select(storeItems =>
|
||||
Task.Run(async () => await storage.Write(storeItems))));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Assert.IsInstanceOfType(ex, typeof(BotStorageException));
|
||||
}
|
||||
|
||||
var readStoreItems = new Dictionary<string, object>(await storage.Read("createPoco"));
|
||||
Assert.IsInstanceOfType(readStoreItems["createPoco"], typeof(PocoItem));
|
||||
var createPoco = readStoreItems["createPoco"] as PocoItem;
|
||||
Assert.AreEqual(createPoco.Id, "1", "createPoco.id should be 1");
|
||||
}
|
||||
}
|
||||
|
||||
public class PocoItem
|
||||
{
|
||||
public string Id { get; set; }
|
||||
|
||||
public int Count { get; set; }
|
||||
|
||||
public string[] ExtraBytes { get; set; }
|
||||
}
|
||||
|
||||
public class PocoStoreItem : IStoreItem
|
||||
{
|
||||
public string eTag { get; set; }
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public int Count { get; set; }
|
||||
}
|
||||
}
|
|
@ -8,7 +8,7 @@ using Microsoft.Bot.Builder.Adapters;
|
|||
using Microsoft.Bot.Schema;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Tests
|
||||
namespace Microsoft.Bot.Builder.Tests
|
||||
{
|
||||
[TestClass]
|
||||
[TestCategory("Adapter")]
|
|
@ -1,6 +1,6 @@
|
|||
using Microsoft.Bot.Schema;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Tests
|
||||
namespace Microsoft.Bot.Builder.Tests
|
||||
{
|
||||
public static class TestMessage
|
||||
{
|
|
@ -1,61 +1,61 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Microsoft.Bot.Schema;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Extensions.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// Helpers to get activities from trancript files
|
||||
/// </summary>
|
||||
public static class TranscriptUtilities
|
||||
{
|
||||
/// <summary>
|
||||
/// Loads a list of activities from a transcript file.
|
||||
/// Use the context of the test to find the transcript file
|
||||
/// </summary>
|
||||
/// <param name="context">Test context</param>
|
||||
/// <returns>A list of activities to test</returns>
|
||||
public static IEnumerable<IActivity> GetFromTestContext(TestContext context)
|
||||
{
|
||||
var transcriptsRootFolder = TestUtilities.GetKey("TranscriptsRootFolder") ?? @"..\..\..\..\..\transcripts";
|
||||
var directory = Path.Combine(transcriptsRootFolder, context.FullyQualifiedTestClassName.Split('.').Last());
|
||||
var fileName = $"{context.TestName}.transcript";
|
||||
var path = Path.Combine(directory, fileName);
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
Assert.Fail($"Required transcript file '{path}' does not exists in '{transcriptsRootFolder}' folder. Review the 'TranscriptsRootFolder' environment variable value.");
|
||||
}
|
||||
|
||||
var content = File.ReadAllText(path);
|
||||
return JsonConvert.DeserializeObject<Activity[]>(content);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get a conversation reference.
|
||||
/// This method can be used to set the conversation reference needed to create a <see cref="Adapters.TestAdapter"/>
|
||||
/// </summary>
|
||||
/// <param name="activity"></param>
|
||||
/// <returns>A valid conversation reference to the activity provides</returns>
|
||||
public static ConversationReference GetConversationReference(this IActivity activity)
|
||||
{
|
||||
bool IsReply(IActivity act) => string.Equals("bot", act.From?.Role, StringComparison.InvariantCultureIgnoreCase);
|
||||
var bot = IsReply(activity) ? activity.From : activity.Recipient;
|
||||
var user = IsReply(activity) ? activity.Recipient : activity.From;
|
||||
return new ConversationReference
|
||||
{
|
||||
User = user,
|
||||
Bot = bot,
|
||||
Conversation = activity.Conversation,
|
||||
ChannelId = activity.ChannelId,
|
||||
ServiceUrl = activity.ServiceUrl
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Microsoft.Bot.Schema;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Extensions.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// Helpers to get activities from trancript files
|
||||
/// </summary>
|
||||
public static class TranscriptUtilities
|
||||
{
|
||||
/// <summary>
|
||||
/// Loads a list of activities from a transcript file.
|
||||
/// Use the context of the test to find the transcript file
|
||||
/// </summary>
|
||||
/// <param name="context">Test context</param>
|
||||
/// <returns>A list of activities to test</returns>
|
||||
public static IEnumerable<IActivity> GetFromTestContext(TestContext context)
|
||||
{
|
||||
var transcriptsRootFolder = TestUtilities.GetKey("TranscriptsRootFolder") ?? @"..\..\..\..\..\transcripts";
|
||||
var directory = Path.Combine(transcriptsRootFolder, context.FullyQualifiedTestClassName.Split('.').Last());
|
||||
var fileName = $"{context.TestName}.transcript";
|
||||
var path = Path.Combine(directory, fileName);
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
Assert.Fail($"Required transcript file '{path}' does not exists in '{transcriptsRootFolder}' folder. Review the 'TranscriptsRootFolder' environment variable value.");
|
||||
}
|
||||
|
||||
var content = File.ReadAllText(path);
|
||||
return JsonConvert.DeserializeObject<Activity[]>(content);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get a conversation reference.
|
||||
/// This method can be used to set the conversation reference needed to create a <see cref="Adapters.TestAdapter"/>
|
||||
/// </summary>
|
||||
/// <param name="activity"></param>
|
||||
/// <returns>A valid conversation reference to the activity provides</returns>
|
||||
public static ConversationReference GetConversationReference(this IActivity activity)
|
||||
{
|
||||
bool IsReply(IActivity act) => string.Equals("bot", act.From?.Role, StringComparison.InvariantCultureIgnoreCase);
|
||||
var bot = IsReply(activity) ? activity.From : activity.Recipient;
|
||||
var user = IsReply(activity) ? activity.Recipient : activity.From;
|
||||
return new ConversationReference
|
||||
{
|
||||
User = user,
|
||||
Bot = bot,
|
||||
Conversation = activity.Conversation,
|
||||
ChannelId = activity.ChannelId,
|
||||
ServiceUrl = activity.ServiceUrl
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@ using Microsoft.Bot.Builder.Adapters;
|
|||
using Microsoft.Bot.Schema;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Bot.Builder.Core.Tests
|
||||
namespace Microsoft.Bot.Builder.Tests
|
||||
{
|
||||
[TestClass]
|
||||
[TestCategory("Middleware")]
|
|
@ -22,7 +22,6 @@
|
|||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\libraries\integration\Microsoft.Bot.Builder.Integration.AspNet.Core\Microsoft.Bot.Builder.Integration.AspNet.Core.csproj" />
|
||||
<ProjectReference Include="..\..\..\libraries\Microsoft.Bot.Builder.Core\Microsoft.Bot.Builder.Core.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -105,10 +105,6 @@
|
|||
<Project>{bd0b82ef-1601-4e87-b78a-b43de7eb36b0}</Project>
|
||||
<Name>Microsoft.Bot.Builder.Integration.AspNet.WebApi</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\libraries\Microsoft.Bot.Builder.Core\Microsoft.Bot.Builder.Core.csproj">
|
||||
<Project>{f0c150e2-9b8a-444c-b70e-97ad918cb3d4}</Project>
|
||||
<Name>Microsoft.Bot.Builder.Core</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\libraries\Microsoft.Bot.Connector\Microsoft.Bot.Connector.csproj">
|
||||
<Project>{6462DA5D-27DC-4CD5-9467-5EFB998FD838}</Project>
|
||||
<Name>Microsoft.Bot.Connector</Name>
|
||||
|
|
Загрузка…
Ссылка в новой задаче