Пример #1
0
        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());
            }
        }
Пример #2
0
        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));
        }
Пример #3
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));
        }
Пример #4
0
        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));
        }
Пример #5
0
        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"));
        }
Пример #6
0
        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"));
        }
Пример #7
0
        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));
        }
Пример #8
0
        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();
            }
        }
Пример #9
0
        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);
        }
Пример #10
0
        public void WrapperBuilder_MinimalBuilder_ServerPathSet()
        {
            var wrapper = (Wrapper)WrapperBuilder.WithServer(HttpsExampleCom).Build();

            Assert.That(wrapper.ServerPath, Is.EqualTo(HttpsExampleCom));
        }
Пример #11
0
        public void Errors_NoErrors_Exception()
        {
            var wrapper = WrapperBuilder.WithServer("").Build();

            Assert.Throws <ArgumentException>(() => wrapper.Errors(new ApiError[0]));
        }