Skip to content

Commit 29b9141

Browse files
Merge pull request #16 from umbraco/temp-sebfix
Temp sebfix
2 parents b901b1a + 991f7cf commit 29b9141

File tree

4 files changed

+250
-27
lines changed

4 files changed

+250
-27
lines changed

src/Umbraco.Deploy.Contrib.Connectors/ValueConnectors/VortoValueConnector.cs

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Newtonsoft.Json.Linq;
66
using Umbraco.Core;
77
using Umbraco.Core.Deploy;
8+
using Umbraco.Core.Logging;
89
using Umbraco.Core.Models;
910
using Umbraco.Core.Services;
1011
using Umbraco.Deploy.ValueConnectors;
@@ -95,18 +96,8 @@ public string GetValue(Property property, ICollection<ArtifactDependency> depend
9596

9697
object parsedValue = valueConnector.GetValue(mockProperty, dependencies);
9798

98-
// test if the value is a json object (thus could be a nested complex editor)
99-
// if that's the case we'll need to add it as a json object instead of string to avoid it being escaped
100-
var jtokenValue = parsedValue != null && parsedValue.ToString().DetectIsJson() ? JToken.Parse(parsedValue.ToString()) : null;
101-
if (jtokenValue != null)
102-
{
103-
parsedValue = jtokenValue;
104-
}
105-
else if (parsedValue != null)
106-
{
107-
parsedValue = parsedValue.ToString();
108-
}
10999
// set the parsed value back onto the original object.
100+
// it may be a string representing more json but that's fine
110101
vortoValue.Values.ValuePairs[languageKey] = parsedValue;
111102
}
112103
value = JsonConvert.SerializeObject(vortoValue);
@@ -164,26 +155,15 @@ public void SetValue(IContentBase content, string alias, string value)
164155
{
165156
var val = vortoValue.Values.ValuePairs[languageKey];
166157

167-
var mockProperty = new Property(propertyType, val);
158+
var mockProperty = new Property(propertyType);
168159
var mockContent = new Content("mockContent", -1, new ContentType(-1), new PropertyCollection(new List<Property> {mockProperty}));
169160

170161
// due to how ValueConnector.SetValue() works, we have to pass the mock item through the connector to have it do its
171162
// work on parsing the value on the item itself.
172-
valueConnector.SetValue(mockContent, mockProperty.Alias, val.ToString());
163+
valueConnector.SetValue(mockContent, mockProperty.Alias, val?.ToString());
173164

174-
// we then extract the converted value from the mock item so we can assign it to the inner value object inside the
175-
// actual Vorto item's value pair for this specific language.
165+
// get the value back and assign
176166
var convertedValue = mockContent.GetValue(mockProperty.Alias);
177-
178-
var jtokenValue = convertedValue != null && convertedValue.ToString().DetectIsJson() ? JToken.Parse(convertedValue.ToString()) : null;
179-
if (jtokenValue != null)
180-
{
181-
convertedValue = jtokenValue;
182-
}
183-
else if (convertedValue != null)
184-
{
185-
convertedValue = convertedValue.ToString();
186-
}
187167
vortoValue.Values.ValuePairs[languageKey] = convertedValue;
188168
}
189169

@@ -205,15 +185,15 @@ public void SetValue(IContentBase content, string alias, string value)
205185
/// ]]>
206186
/// </example>
207187

208-
internal class VortoValue
188+
public class VortoValue
209189
{
210190
[JsonProperty("values")]
211191
public Values Values { get; set; }
212192
[JsonProperty("dtdGuid")]
213193
public string DtdGuid { get; set; }
214194
}
215195

216-
internal class Values
196+
public class Values
217197
{
218198
/// <summary>
219199
/// The value properties will be serialized to a dictionary
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Moq;
7+
using NUnit.Framework;
8+
using Umbraco.Core;
9+
using Umbraco.Core.Configuration;
10+
using Umbraco.Core.Configuration.UmbracoSettings;
11+
using Umbraco.Core.Deploy;
12+
using Umbraco.Core.Models;
13+
using Umbraco.Core.Services;
14+
using Umbraco.Deploy.Contrib.Connectors.ValueConnectors;
15+
using Umbraco.Deploy.ValueConnectors;
16+
17+
namespace Umbraco.Deploy.Contrib.Tests.Connectors
18+
{
19+
[TestFixture]
20+
public class VortoValueConnectorTests
21+
{
22+
[Test]
23+
public void GetValueTest()
24+
{
25+
var dataTypeService = Mock.Of<IDataTypeService>();
26+
27+
var vortoDataType = new DataTypeDefinition("vortoEditorAlias")
28+
{
29+
Id = 1,
30+
Key = Guid.Parse("ebd71353-206e-4df6-8a4c-e194519f7794"),
31+
DatabaseType = DataTypeDatabaseType.Ntext
32+
};
33+
34+
var innerDataType = new DataTypeDefinition("innerEditorAlias")
35+
{
36+
Id = 2,
37+
Key = Guid.Parse("92897bc6-a5f3-4ffe-ae27-f2e7e33dda49"),
38+
DatabaseType = DataTypeDatabaseType.Integer // for true/false
39+
};
40+
41+
var dataTypes = new[] { vortoDataType, innerDataType };
42+
43+
Mock.Get(dataTypeService)
44+
.Setup(x => x.GetDataTypeDefinitionById(It.IsAny<Guid>()))
45+
.Returns<Guid>(id => dataTypes.FirstOrDefault(x => x.Key == id));
46+
47+
var preValues = new Dictionary<int, PreValueCollection>
48+
{
49+
{ 1, new PreValueCollection(new Dictionary<string, PreValue>
50+
{
51+
{ "dataType", new PreValue("{\"guid\":\"92897bc6-a5f3-4ffe-ae27-f2e7e33dda49\",\"name\":\"True/False\",\"propertyEditorAlias\":\"innerEditorAlias\"}") }
52+
})
53+
}
54+
};
55+
56+
Mock.Get(dataTypeService)
57+
.Setup(x => x.GetPreValuesCollectionByDataTypeId(It.IsAny<int>()))
58+
.Returns<int>(id => preValues.TryGetValue(id, out var collection) ? collection : null);
59+
60+
ValueConnectorCollection connectors = null;
61+
var defaultConnector = new DefaultValueConnector();
62+
var vortoConnector = new VortoValueConnector(dataTypeService, new Lazy<ValueConnectorCollection>(() => connectors));
63+
connectors = new ValueConnectorCollection(new Dictionary<string, IValueConnector>
64+
{
65+
{ "innerEditorAlias", defaultConnector },
66+
{ "vortoEditorAlias", vortoConnector }
67+
});
68+
69+
var input = "{\"values\":{\"da-DK\":0,\"de-DE\":0,\"en-GB\":0,\"en\":0},\"dtdGuid\":\"ebd71353-206e-4df6-8a4c-e194519f7794\"}";
70+
71+
var propertyType = new PropertyType(vortoDataType);
72+
var property = new Property(propertyType, input);
73+
var dependencies = new List<ArtifactDependency>();
74+
var output = vortoConnector.GetValue(property, dependencies);
75+
76+
Console.WriteLine(output);
77+
Assert.AreEqual("{\"values\":{\"da-DK\":\"i0\",\"de-DE\":\"i0\",\"en-GB\":\"i0\",\"en\":\"i0\"},\"dtdGuid\":\"ebd71353-206e-4df6-8a4c-e194519f7794\"}", output);
78+
}
79+
80+
[Test]
81+
public void SetValueTest()
82+
{
83+
var dataTypeService = Mock.Of<IDataTypeService>();
84+
85+
var vortoDataType = new DataTypeDefinition("vortoEditorAlias")
86+
{
87+
Id = 1,
88+
Key = Guid.Parse("ebd71353-206e-4df6-8a4c-e194519f7794"),
89+
DatabaseType = DataTypeDatabaseType.Ntext
90+
};
91+
92+
var innerDataType = new DataTypeDefinition("innerEditorAlias")
93+
{
94+
Id = 2,
95+
Key = Guid.Parse("92897bc6-a5f3-4ffe-ae27-f2e7e33dda49"),
96+
DatabaseType = DataTypeDatabaseType.Integer // for true/false
97+
};
98+
99+
var dataTypes = new[] { vortoDataType, innerDataType };
100+
101+
Mock.Get(dataTypeService)
102+
.Setup(x => x.GetDataTypeDefinitionById(It.IsAny<Guid>()))
103+
.Returns<Guid>(id => dataTypes.FirstOrDefault(x => x.Key == id));
104+
105+
var preValues = new Dictionary<int, PreValueCollection>
106+
{
107+
{ 1, new PreValueCollection(new Dictionary<string, PreValue>
108+
{
109+
{ "dataType", new PreValue("{\"guid\":\"92897bc6-a5f3-4ffe-ae27-f2e7e33dda49\",\"name\":\"True/False\",\"propertyEditorAlias\":\"innerEditorAlias\"}") }
110+
})
111+
}
112+
};
113+
114+
Mock.Get(dataTypeService)
115+
.Setup(x => x.GetPreValuesCollectionByDataTypeId(It.IsAny<int>()))
116+
.Returns<int>(id => preValues.TryGetValue(id, out var collection) ? collection : null);
117+
118+
ValueConnectorCollection connectors = null;
119+
var defaultConnector = new DefaultValueConnector();
120+
var vortoConnector = new VortoValueConnector(dataTypeService, new Lazy<ValueConnectorCollection>(() => connectors));
121+
connectors = new ValueConnectorCollection(new Dictionary<string, IValueConnector>
122+
{
123+
{ "innerEditorAlias", defaultConnector },
124+
{ "vortoEditorAlias", vortoConnector }
125+
});
126+
127+
var input = "{\"values\":{\"da-DK\":\"i0\",\"de-DE\":\"i0\",\"en-GB\":\"i0\",\"en\":\"i0\"},\"dtdGuid\":\"ebd71353-206e-4df6-8a4c-e194519f7794\"}";
128+
129+
UmbracoConfig.For.SetUmbracoSettings(GenerateMockSettings());
130+
131+
var vortoPropertyType = new PropertyType(vortoDataType, "vortoProperty");
132+
var vortoProperty = new Property(vortoPropertyType, null); // value is going to be replaced
133+
var vortoContent = new Content("mockContent", -1, new ContentType(-1), new PropertyCollection(new List<Property> { vortoProperty }));
134+
vortoConnector.SetValue(vortoContent, "vortoProperty", input);
135+
136+
var output = vortoContent.GetValue("vortoProperty");
137+
138+
// fixme - why strings and not integers?!
139+
// so "i0" is sent to default connector, but it sets value to "0" not 0 - wtf?
140+
141+
Assert.IsInstanceOf<string>(output);
142+
143+
Console.WriteLine(output);
144+
Assert.AreEqual("{\"values\":{\"da-DK\":0,\"de-DE\":0,\"en-GB\":0,\"en\":0},\"dtdGuid\":\"ebd71353-206e-4df6-8a4c-e194519f7794\"}", output);
145+
}
146+
147+
[Test]
148+
public void SetValueDefaultConnectorTest()
149+
{
150+
UmbracoConfig.For.SetUmbracoSettings(GenerateMockSettings());
151+
152+
var propertyType = new PropertyType(new DataTypeDefinition("dataTypeAlias")
153+
{
154+
DatabaseType = DataTypeDatabaseType.Integer
155+
}, "propertyTypeAlias");
156+
157+
var property = new Property(propertyType);
158+
159+
property.Value = 12;
160+
Assert.AreEqual(12, property.Value);
161+
property.Value = "24";
162+
Assert.AreEqual(24, property.Value);
163+
164+
var content = new Content("contentName", -1, new ContentType(-1), new PropertyCollection(new[] { property }));
165+
var defaultConnector = new DefaultValueConnector();
166+
defaultConnector.SetValue(content, "propertyTypeAlias", "i36");
167+
168+
Assert.AreEqual(36, property.Value);
169+
}
170+
171+
public static IUmbracoSettingsSection GenerateMockSettings()
172+
{
173+
var settings = new Mock<IUmbracoSettingsSection>();
174+
175+
var content = new Mock<IContentSection>();
176+
var security = new Mock<ISecuritySection>();
177+
var requestHandler = new Mock<IRequestHandlerSection>();
178+
var templates = new Mock<ITemplatesSection>();
179+
var dev = new Mock<IDeveloperSection>();
180+
var logging = new Mock<ILoggingSection>();
181+
var tasks = new Mock<IScheduledTasksSection>();
182+
var distCall = new Mock<IDistributedCallSection>();
183+
var repos = new Mock<IRepositoriesSection>();
184+
var providers = new Mock<IProvidersSection>();
185+
var routing = new Mock<IWebRoutingSection>();
186+
187+
settings.Setup(x => x.Content).Returns(content.Object);
188+
settings.Setup(x => x.Security).Returns(security.Object);
189+
settings.Setup(x => x.RequestHandler).Returns(requestHandler.Object);
190+
settings.Setup(x => x.Templates).Returns(templates.Object);
191+
settings.Setup(x => x.Developer).Returns(dev.Object);
192+
settings.Setup(x => x.Logging).Returns(logging.Object);
193+
settings.Setup(x => x.ScheduledTasks).Returns(tasks.Object);
194+
settings.Setup(x => x.DistributedCall).Returns(distCall.Object);
195+
settings.Setup(x => x.PackageRepositories).Returns(repos.Object);
196+
settings.Setup(x => x.Providers).Returns(providers.Object);
197+
settings.Setup(x => x.WebRouting).Returns(routing.Object);
198+
199+
//Now configure some defaults - the defaults in the config section classes do NOT pertain to the mocked data!!
200+
settings.Setup(x => x.Content.ForceSafeAliases).Returns(true);
201+
//settings.Setup(x => x.Content.ImageAutoFillProperties).Returns(ContentImagingElement.GetDefaultImageAutoFillProperties());
202+
//settings.Setup(x => x.Content.ImageFileTypes).Returns(ContentImagingElement.GetDefaultImageFileTypes());
203+
settings.Setup(x => x.RequestHandler.AddTrailingSlash).Returns(true);
204+
settings.Setup(x => x.RequestHandler.UseDomainPrefixes).Returns(false);
205+
//settings.Setup(x => x.RequestHandler.CharCollection).Returns(RequestHandlerElement.GetDefaultCharReplacements());
206+
settings.Setup(x => x.Content.UmbracoLibraryCacheDuration).Returns(1800);
207+
settings.Setup(x => x.WebRouting.UrlProviderMode).Returns("AutoLegacy");
208+
settings.Setup(x => x.Templates.DefaultRenderingEngine).Returns(RenderingEngine.Mvc);
209+
settings.Setup(x => x.Providers.DefaultBackOfficeUserProvider).Returns("UsersMembershipProvider");
210+
211+
return settings.Object;
212+
}
213+
}
214+
}

src/Umbraco.Deploy.Contrib.Tests/Umbraco.Deploy.Contrib.Tests.csproj

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
<Reference Include="businesslogic, Version=1.0.6396.36624, Culture=neutral, processorArchitecture=MSIL">
4848
<HintPath>..\packages\UmbracoCms.Core.7.6.4\lib\net45\businesslogic.dll</HintPath>
4949
</Reference>
50+
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
51+
<HintPath>..\packages\Castle.Core.4.2.1\lib\net45\Castle.Core.dll</HintPath>
52+
</Reference>
5053
<Reference Include="ClientDependency.Core, Version=1.9.2.0, Culture=neutral, processorArchitecture=MSIL">
5154
<HintPath>..\packages\ClientDependency.1.9.2\lib\net45\ClientDependency.Core.dll</HintPath>
5255
</Reference>
@@ -146,12 +149,18 @@
146149
<Reference Include="MiniProfiler, Version=2.1.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3, processorArchitecture=MSIL">
147150
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
148151
</Reference>
152+
<Reference Include="Moq, Version=4.8.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
153+
<HintPath>..\packages\Moq.4.8.1\lib\net45\Moq.dll</HintPath>
154+
</Reference>
149155
<Reference Include="MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
150156
<HintPath>..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll</HintPath>
151157
</Reference>
152158
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
153159
<HintPath>..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
154160
</Reference>
161+
<Reference Include="nunit.framework, Version=3.9.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
162+
<HintPath>..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll</HintPath>
163+
</Reference>
155164
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
156165
<HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
157166
</Reference>
@@ -162,6 +171,7 @@
162171
<HintPath>..\packages\UmbracoCms.Core.7.6.4\lib\net45\SQLCE4Umbraco.dll</HintPath>
163172
</Reference>
164173
<Reference Include="System" />
174+
<Reference Include="System.Configuration" />
165175
<Reference Include="System.Core" />
166176
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
167177
<HintPath>..\packages\UmbracoCms.Core.7.6.4\lib\net45\System.Data.SqlServerCe.dll</HintPath>
@@ -176,6 +186,12 @@
176186
<Reference Include="System.Threading.Tasks.Dataflow, Version=4.6.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
177187
<HintPath>..\packages\System.Threading.Tasks.Dataflow.4.7.0\lib\portable-net45+win8+wpa81\System.Threading.Tasks.Dataflow.dll</HintPath>
178188
</Reference>
189+
<Reference Include="System.Threading.Tasks.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
190+
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
191+
</Reference>
192+
<Reference Include="System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
193+
<HintPath>..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
194+
</Reference>
179195
<Reference Include="System.Web.Cors, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
180196
<HintPath>..\packages\Microsoft.AspNet.Cors.5.0.0\lib\net45\System.Web.Cors.dll</HintPath>
181197
</Reference>
@@ -244,6 +260,7 @@
244260
<Compile Include="Connectors\LeBlenderGridCellValueConnectorTests.cs" />
245261
<Compile Include="Connectors\NestedContentValueConnectorTests.cs" />
246262
<Compile Include="Connectors\UrlPickerValueConnectorTests.cs" />
263+
<Compile Include="Connectors\VortoValueConnectorTests.cs" />
247264
<Compile Include="Properties\AssemblyInfo.cs" />
248265
<Compile Include="TestHelpers\MemoryFileTypeCollection.cs" />
249266
<Compile Include="TestHelpers\MockedContent.cs" />
@@ -254,8 +271,15 @@
254271
<Compile Include="TestHelpers\TestFileTypeCollection.cs" />
255272
</ItemGroup>
256273
<ItemGroup>
274+
<None Include="app.config" />
257275
<None Include="packages.config" />
258276
</ItemGroup>
277+
<ItemGroup>
278+
<ProjectReference Include="..\Umbraco.Deploy.Contrib.Connectors\Umbraco.Deploy.Contrib.Connectors.csproj">
279+
<Project>{42fb2213-0815-41cd-94f8-dfb0ec1d8061}</Project>
280+
<Name>Umbraco.Deploy.Contrib.Connectors</Name>
281+
</ProjectReference>
282+
</ItemGroup>
259283
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
260284
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
261285
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

0 commit comments

Comments
 (0)