public void WrapAll_SmallCollection_WrappingIsDeferred() { IEnumerable <Person> People() { yield return(_person1); yield return(_person2); throw new Exception(); } IWrapper wrapper = WrapperBuilder.WithServer("http://api.example.com").Build(); var collection = wrapper.WrapAll <Person>(People()); collection.Meta["count"] = 3; using (var e = collection.Data.GetEnumerator()) { if (!e.MoveNext()) { Assert.Fail("Collection too small"); } if (!e.MoveNext()) { Assert.Fail("Collection too small"); } Assert.Throws <Exception>(() => e.MoveNext()); } }
public void WrapAll_EmptyCollection_CountZero() { Person[] people = new Person[] {}; IWrapper wrapper = WrapperBuilder.WithServer("http://api.example.com").Build(); var collection = wrapper.WrapAll <Person>(people); collection.Meta["count"] = 0; Assert.That(collection.Data.Count(), Is.EqualTo(0)); }
public void WrapAll_SmallCollection_CountMatches() { Person[] people = { _person1, _person2 }; IWrapper wrapper = WrapperBuilder.WithServer("http://api.example.com").Build(); var collection = wrapper.WrapAll <Person>(people); collection.Meta["count"] = people.Length; Assert.That(collection.Data.Count(), Is.EqualTo(2)); }
public void WithDefaultConfig_AllPolicyAsserts_NoException() { IWrapper wrapper = WrapperBuilder.WithServer(HttpsExampleCom).WithDefaultConfig(p => { p.CamelCasedNames(); p.HideDefaults(); p.HyphenCasedTypes(); p.PluralTypes(); p.WithCanonicalLinks(); p.WithSelfLinks(); }).Build(); Assert.That(wrapper.ServerPath, Is.EqualTo(HttpsExampleCom)); }
public void WrapAll_SmallCollection_TypeAndIdMatches() { Person[] people = { _person1, _person2 }; IWrapper wrapper = WrapperBuilder.WithServer("http://api.example.com").Build(); var collection = wrapper.WrapAll <Person>(people); var e0 = collection.Data.ElementAt(0); var e1 = collection.Data.ElementAt(1); Assert.That(e0.Type, Is.EqualTo("people")); Assert.That(e0.Id, Is.EqualTo("1")); Assert.That(e1.Type, Is.EqualTo("people")); Assert.That(e1.Id, Is.EqualTo("2")); }
public void Errors_OneError_IsWrapped() { var wrapper = WrapperBuilder.WithServer("").Build(); var apiError = new ApiError("internal", "400", "detail"); apiError.Source["pointer"] = "it/is/here"; apiError.Source["header"] = "and/here"; var envelope = wrapper.Errors(new[] { apiError }); var e0 = envelope.Errors.ElementAt(0); Assert.That(e0.Code, Is.EqualTo("internal")); Assert.That(e0.Status, Is.EqualTo("400")); Assert.That(e0.Detail, Is.EqualTo("detail")); Assert.That(e0.Source, Contains.Key("pointer")); Assert.That(e0.Source["header"], Is.EqualTo("and/here")); }
public void Wrapper_WrapPerson_IdAndTypeSet(Person p) { Assume.That(p, Is.Not.Null); IWrapper wrapper = WrapperBuilder .WithServer("http://api.example.com") .WithDefaultConfig(null) .WithTypeConfig <Person>(x => x.WithId("Id")) .Build(); var rep = wrapper.Wrap(p); Resource <Person> rp = rep.Data; var expectedType = typeof(Person).Name.ToPlural().ToHyphenCase(); // people Assert.That(rp.Type, Is.EqualTo(expectedType)); var expectedId = p.Id.ToString(); Assert.That(rp.Id, Is.EqualTo(expectedId)); }
public TodoController(TodoContext context, LinkGenerator linkGenerator) { _context = context; _linkGenerator = linkGenerator; var path = ""; // TODO _wrapper = WrapperBuilder .WithServer(path) .WithDefaultConfig(p => p.HyphenCasedTypes()) .WithTypeConfig <TodoItem>(p => p.WithType("todo")) .Build(); if (_context.TodoItems.Count() == 0) { // Create a new TodoItems if collection is empty, // which means you can't delete all TodoItems. _context.TodoItems.Add(new TodoItem { Name = "Item1" }); _context.SaveChanges(); } }
public async Task Test1() { var builder = new WrapperBuilder(); builder.RootTypes.Add(typeof(Derived)); builder.AssembliesWithTypesToWrap.Add(typeof(Derived).Assembly); await builder.BuildAsync(GetWriter); var stream = _files[$"Company.IBase"]; stream.Position = 0; var baseInterface = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System; using OtherNamespace; namespace Company { public partial interface IBase { string Dog { get; set; } DateTime Raccoon { get; } void DoStuff(IOther other); } }", baseInterface); stream = _files[$"Company.BaseWrapper"]; stream.Position = 0; var baseClass = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System; using OtherNamespace; namespace Company { public partial class BaseWrapper : IBase { public static implicit operator BaseWrapper(Company.Base @object) => @object != null ? new BaseWrapper(@object) : null; public static implicit operator Company.Base(BaseWrapper @object) => @object?.Object; public Company.Base Object { get; } public string Dog { get => Object.Dog; set => Object.Dog = value; } public DateTime Raccoon => Object.Raccoon; public BaseWrapper(Company.Base @object) { Object = @object ?? throw new ArgumentNullException(nameof(@object)); } public void DoStuff(OtherWrapper other) => Object.DoStuff(other); void IBase.DoStuff(IOther other) => DoStuff((OtherWrapper)other); } }", baseClass); stream = _files[$"Company.IDerived"]; stream.Position = 0; var derivedInterface = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System.Collections.Generic; using OtherNamespace; namespace Company { public partial interface IDerived : IBase { IList<IBase> Array { get; set; } decimal Bird { set; } IOther Cat { get; set; } ICollection Collection { get; set; } IOther this[int index] { get; } List<string> Names { get; set; } } }", derivedInterface); stream = _files[$"Company.DerivedWrapper"]; stream.Position = 0; var derivedClass = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System.Collections.Generic; using OtherNamespace; using WrapIt.Collections; namespace Company { public partial class DerivedWrapper : BaseWrapper, IDerived { public static implicit operator DerivedWrapper(Company.Derived @object) => @object != null ? new DerivedWrapper(@object) : null; public static implicit operator Company.Derived(DerivedWrapper @object) => @object?.Object; public new Company.Derived Object => (Company.Derived)base.Object; public ArrayWrapper<Company.Base, BaseWrapper, IBase> Array { get => Object.Array; set => Object.Array = value?.ToArray(); } IList<IBase> IDerived.Array { get => Array; set => Array = ArrayWrapper<Company.Base, BaseWrapper, IBase>.Create(value); } public decimal Bird { set => Object.Bird = value; } public OtherWrapper Cat { get => Object.Cat; set => Object.Cat = value; } IOther IDerived.Cat { get => Cat; set => Cat = (OtherWrapper)value; } public CollectionWrapper Collection { get => Object.Collection; set => Object.Collection = value; } ICollection IDerived.Collection { get => Collection; set => Collection = (CollectionWrapper)value; } public OtherWrapper this[int index] => Object[index]; IOther IDerived.this[int index] => this[index]; public List<string> Names { get => Object.Names; set => Object.Names = value; } public DerivedWrapper(Company.Derived @object) : base(@object) { } } }", derivedClass); stream = _files[$"Company.ICollection"]; stream.Position = 0; var collectionInterface = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System.Collections; using System.Collections.Generic; namespace Company { public partial interface ICollection : IEnumerable, IEnumerable<IDerived> { IDerived this[int index] { get; } } }", collectionInterface); stream = _files[$"Company.CollectionWrapper"]; stream.Position = 0; var collectionClass = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System; using System.Collections; using System.Collections.Generic; namespace Company { public partial class CollectionWrapper : ICollection { public static implicit operator CollectionWrapper(Company.Collection @object) => @object != null ? new CollectionWrapper(@object) : null; public static implicit operator Company.Collection(CollectionWrapper @object) => @object?.Object; public Company.Collection Object { get; } public DerivedWrapper this[int index] => Object[index]; IDerived ICollection.this[int index] => this[index]; public CollectionWrapper(Company.Collection @object) { Object = @object ?? throw new ArgumentNullException(nameof(@object)); } IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable<IDerived>)this).GetEnumerator(); public IEnumerator<DerivedWrapper> GetEnumerator() { foreach (var item in Object) { yield return (Company.Derived)item; } } IEnumerator<IDerived> IEnumerable<IDerived>.GetEnumerator() => GetEnumerator(); } }", collectionClass); stream = _files[$"OtherNamespace.IOther"]; stream.Position = 0; var otherInterface = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System; using Company; namespace OtherNamespace { public partial interface IOther { int? Count { get; set; } DateTime? this[string name, int? index] { get; set; } string this[IBase b] { set; } string[] StringArray { get; set; } event FieldChangeEventHandlerWrapper FieldChange; } }", otherInterface); stream = _files[$"OtherNamespace.FieldChangeEventHandlerWrapper"]; stream.Position = 0; var fieldChangeEventHandlerWrapper = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"namespace OtherNamespace { public delegate void FieldChangeEventHandlerWrapper(object source, IFieldChangeEventArgs e); }", fieldChangeEventHandlerWrapper); stream = _files[$"OtherNamespace.IFieldChangeEventArgs"]; stream.Position = 0; var fieldChangeEventArgsInterface = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"namespace OtherNamespace { public partial interface IFieldChangeEventArgs { int BorrowerPair { get; } string FieldId { get; } string NewValue { get; } string PriorValue { get; } } }", fieldChangeEventArgsInterface); stream = _files[$"OtherNamespace.FieldChangeEventArgsWrapper"]; stream.Position = 0; var fieldChangeEventArgsClass = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System; namespace OtherNamespace { public partial class FieldChangeEventArgsWrapper : IFieldChangeEventArgs { public static implicit operator FieldChangeEventArgsWrapper(OtherNamespace.FieldChangeEventArgs @object) => @object != null ? new FieldChangeEventArgsWrapper(@object) : null; public static implicit operator OtherNamespace.FieldChangeEventArgs(FieldChangeEventArgsWrapper @object) => @object?.Object; public OtherNamespace.FieldChangeEventArgs Object { get; } public int BorrowerPair => Object.BorrowerPair; public string FieldId => Object.FieldId; public string NewValue => Object.NewValue; public string PriorValue => Object.PriorValue; public FieldChangeEventArgsWrapper(OtherNamespace.FieldChangeEventArgs @object) { Object = @object ?? throw new ArgumentNullException(nameof(@object)); } } }", fieldChangeEventArgsClass); stream = _files[$"OtherNamespace.OtherWrapper"]; stream.Position = 0; var otherClass = new StreamReader(stream).ReadToEnd(); Assert.AreEqual(@"using System; using Company; namespace OtherNamespace { public partial class OtherWrapper : IOther { public static implicit operator OtherWrapper(OtherNamespace.Other @object) => @object != null ? new OtherWrapper(@object) : null; public static implicit operator OtherNamespace.Other(OtherWrapper @object) => @object?.Object; public OtherNamespace.Other Object { get; } public int? Count { get => Object.Count; set => Object.Count = value; } public DateTime? this[string name, int? index] { get => Object[name, index]; set => Object[name, index] = value; } public string this[BaseWrapper b] { set => Object[b] = value; } string IOther.this[IBase b] { set => this[(BaseWrapper)b] = value; } public string[] StringArray { get => Object.StringArray; set => Object.StringArray = value; } public event FieldChangeEventHandlerWrapper FieldChange { add => AddOrRemoveFieldChange(value, true); remove => AddOrRemoveFieldChange(value, false); } private void AddOrRemoveFieldChange(FieldChangeEventHandlerWrapper value, bool toAdd) { if (value != null) { OtherNamespace.FieldChangeEventHandler handler = (source, e) => value(source, (FieldChangeEventArgsWrapper)e); if (toAdd) { Object.FieldChange += handler; } else { Object.FieldChange -= handler; } } } public OtherWrapper(OtherNamespace.Other @object) { Object = @object ?? throw new ArgumentNullException(nameof(@object)); } } }", otherClass); }
public void WrapperBuilder_MinimalBuilder_ServerPathSet() { var wrapper = (Wrapper)WrapperBuilder.WithServer(HttpsExampleCom).Build(); Assert.That(wrapper.ServerPath, Is.EqualTo(HttpsExampleCom)); }
public void Errors_NoErrors_Exception() { var wrapper = WrapperBuilder.WithServer("").Build(); Assert.Throws <ArgumentException>(() => wrapper.Errors(new ApiError[0])); }