public static Field FieldCreator() { var randomNumber = RandomNumber.Next(1, 8); switch (randomNumber) { case 1: return(new TextField { Name = "TextField{0}".FormatString(RandomNumber.Next(0, 999)) }); case 2: return(new BooleanField { Name = "BooleanField{0}".FormatString(RandomNumber.Next(0, 999)) }); case 3: return(new DateTimeField { Name = "DateTimeField{0}".FormatString(RandomNumber.Next(0, 999)) }); case 4: return(new NumericField { Name = "NumericField{0}".FormatString(RandomNumber.Next(0, 999)) }); case 5: return(new HtmlField { Name = "HtmlField{0}".FormatString(RandomNumber.Next(0, 999)) }); case 6: case 7: return(new EnumerableField { Name = "EnumerableField{0}".FormatString(RandomNumber.Next(0, 999)), EnumerableOf = FieldCreator() }); case 8: var arbitraryObjectField = new ArbitraryObjectField { Name = "ArbitraryObjectField{0}".FormatString (RandomNumber.Next(0, 999)) }; for (int i = 0; i < 3; i++) { arbitraryObjectField.Fields.Add(FieldCreator()); } return(arbitraryObjectField); default: return(default(Field)); } }
private bool IsArbitraryObjectFieldValid(ArbitraryObjectField field, Dough model) { if (model[field.Name] is Dough && !(model[field.Name] as Dough).Keys.Any()) { return(false); } return(field.Fields.Where(f => f is ArbitraryObjectField) .All(f => this.IsArbitraryObjectFieldValid(f as ArbitraryObjectField, model[field.Name] as Dough))); }
public static IEnumerable <object[]> Data() { var metaType = new MetaType { Name = "some_meta_type" }; metaType.Fields.Add(new BooleanField { Name = "Field1" }); metaType.Fields.Add(new BooleanField { Name = "field1" }); yield return(new object[] { metaType }); metaType = new MetaType { Name = "some_meta_type" }; var obj = new ArbitraryObjectField { Name = "obj1" }; obj.Fields.Add(new BooleanField { Name = "Field1" }); obj.Fields.Add(new BooleanField { Name = "field1" }); metaType.Fields.Add(obj); yield return(new object[] { metaType }); metaType = new MetaType { Name = "some_meta_type" }; var obj1 = new ArbitraryObjectField { Name = "obj1" }; var obj2 = new ArbitraryObjectField { Name = "obj2" }; obj2.Fields.Add(new BooleanField { Name = "Field1" }); obj2.Fields.Add(new BooleanField { Name = "field1" }); obj1.Fields.Add(obj2); metaType.Fields.Add(obj1); yield return(new object[] { metaType }); }
public void Should_not_be_able_to_add_duplicate_fields_top_level_or_to_objects_nested_N_levels_deep(int n) { using (var server = TestServer.Create <TestStartup>()) { // arrange var fixture = AutofixtureHelpers.CreateFixture(); var metaType = fixture.Build <MetaType>().Without(type => type.Id).Create(); using (var session = Storage.GetAsyncSession()) { session.StoreAsync(metaType).Wait(); session.SaveChangesAsync().Wait(); } var i = 0; var fields = metaType.Fields; while (i < n) { var obj = new ArbitraryObjectField { Name = "obj{0}".FormatString(i) }; obj.Fields.Add(new BooleanField { Name = "someField" }); fields.Add(obj); fields = obj.Fields; if (i == n - 1) { fields.Add(new BooleanField { Name = "Field1" }); fields.Add(new BooleanField { Name = "field1" }); } i++; } // act var json = JsonConvert.SerializeObject(metaType, this.JsonSerializerSettings); var response = server.CreateRequest("api/metatypes") .And(message => message.Content = new StringContent(json, Encoding.UTF8, "application/json")) .SendAsync("PUT") .Result; // verify var result = JsonConvert.DeserializeObject <ApiError>(response.Content.ReadAsStringAsync().Result); Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); Assert.Equal(ApiErrorCode.DuplicateFieldName, result.ErrorCode); } }
public void Should_not_be_able_to_create_models_with_ArbitraryObject_fields_N_levels_deep_with_an_empty_object_value(int n) { using (var server = TestServer.Create <TestStartup>()) { // arrange var schema = new MetaType { Name = "simple_schema" }; var i = 0; var fields = schema.Fields; while (i < n) { var obj = new ArbitraryObjectField { Name = "obj{0}".FormatString(i) }; fields.Add(obj); fields = obj.Fields; i++; } using (var session = Storage.GetAsyncSession()) { session.StoreAsync(schema).Wait(); session.SaveChangesAsync().Wait(); } // act i = 0; var model = new Model { }; var o = model as Dough; while (i < n) { var fieldName = "obj{0}".FormatString(i); o[fieldName] = new Dough { }; o = o[fieldName] as Dough; i++; } var json = JsonConvert.SerializeObject(model, this.JsonConverter); var response = server.CreateRequest("api/models/{0}".FormatString(schema.Name)) .And(message => message.Content = new StringContent(json, Encoding.UTF8, "application/json")) .PostAsync() .Result; // verify Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); var content = response.Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject <ApiError>(content); Assert.Equal(ApiErrorCode.SchemaMismatch, result.ErrorCode); } }