示例#1
0
        public async Task <IActionResult> Post([FromBody] HomeDefine homedef)
        {
            if (!ModelState.IsValid)
            {
                HIHAPIUtility.HandleModalStateError(ModelState);
            }

            if (!homedef.IsValid(this._context))
            {
                throw new BadRequestException("Inputted object IsValid Failed");
            }

            // User
            String usrName = String.Empty;

            try
            {
                usrName = HIHAPIUtility.GetUserID(this);
                if (String.IsNullOrEmpty(usrName))
                {
                    throw new UnauthorizedAccessException();
                }
            }
            catch
            {
                throw new UnauthorizedAccessException();
            }

            homedef.Createdby = usrName;
            homedef.CreatedAt = DateTime.Now;
            foreach (var hmem in homedef.HomeMembers)
            {
                hmem.CreatedAt = homedef.CreatedAt;
                hmem.Createdby = usrName;
            }
            _context.HomeDefines.Add(homedef);

            await _context.SaveChangesAsync();

            return(Created(homedef));
        }
示例#2
0
        public async Task <IActionResult> Put([FromODataUri] int key, [FromBody] HomeDefine update)
        {
            if (!ModelState.IsValid)
            {
                HIHAPIUtility.HandleModalStateError(ModelState);
            }

            if (key != update.ID)
            {
                throw new BadRequestException("Inputted ID mismatched");
            }

            // User
            String usrName = String.Empty;

            try
            {
                usrName = HIHAPIUtility.GetUserID(this);
                if (String.IsNullOrEmpty(usrName))
                {
                    throw new UnauthorizedAccessException();
                }
            }
            catch
            {
                throw new UnauthorizedAccessException();
            }

            // Check whether User assigned with specified Home ID
            var hms = _context.HomeMembers.Where(p => p.HomeID == update.ID && p.User == usrName).Count();

            if (hms <= 0)
            {
                throw new UnauthorizedAccessException();
            }

            if (!update.IsValid(this._context))
            {
                throw new BadRequestException("Inputted Object IsValid Failed");
            }

            // Find out the home define
            var existinghd = _context.HomeDefines.Find(key);

            if (existinghd == null)
            {
                throw new NotFoundException("Inputted Object Not Found");
            }
            else
            {
                update.Updatedby = usrName;
                update.UpdatedAt = DateTime.Now;
                update.CreatedAt = existinghd.CreatedAt;
                update.Createdby = existinghd.Createdby;
                _context.Entry(existinghd).CurrentValues.SetValues(update);

                var dbmems = _context.HomeMembers.Where(p => p.HomeID == key).ToList();
                foreach (var mem in update.HomeMembers)
                {
                    var memindb = dbmems.Find(p => p.HomeID == key && p.User == mem.User);
                    if (memindb == null)
                    {
                        mem.Createdby = usrName;
                        mem.CreatedAt = DateTime.Now;
                        _context.HomeMembers.Add(mem);
                    }
                    else
                    {
                        mem.CreatedAt = memindb.CreatedAt;
                        mem.Createdby = memindb.Createdby;
                        _context.Entry(memindb).CurrentValues.SetValues(mem);
                    }
                }
                foreach (var mem in dbmems)
                {
                    var nmem = update.HomeMembers.FirstOrDefault(p => p.User == mem.User);
                    if (nmem == null)
                    {
                        _context.HomeMembers.Remove(mem);
                    }
                }
            }

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException exp)
            {
                if (!_context.HomeDefines.Any(p => p.ID == key))
                {
                    throw new NotFoundException("Inputted Object Not Found");
                }
                else
                {
                    throw new DBOperationException(exp.Message);
                }
            }

            return(Updated(update));
        }
        public async Task TestCase_CreateAndUpdateAndDelete(string user, string curr)
        {
            var context   = this.fixture.GetCurrentDataContext();
            var control   = new HomeDefinesController(context);
            var userclaim = DataSetupUtility.GetClaimForUser(user);
            //List<HomeDefine> listObjectCreated = new List<HomeDefine>();
            var hid      = 0;
            var homehost = user;

            control.ControllerContext = new ControllerContext()
            {
                HttpContext = new DefaultHttpContext()
                {
                    User = userclaim
                }
            };

            // Create
            var hd1 = new HomeDefine()
            {
                Name         = "HomeDef.TestCase2." + user,
                Host         = homehost,
                BaseCurrency = curr,
                Createdby    = user,
            };
            var hm1 = new HomeMember()
            {
                Relation       = HomeMemberRelationType.Self,
                DisplayAs      = "Myself",
                User           = homehost,
                HomeDefinition = hd1,
                Createdby      = user,
            };

            hd1.HomeMembers.Add(hm1);
            var rst = await control.Post(hd1);

            var nhdobj = Assert.IsType <CreatedODataResult <HomeDefine> >(rst);

            Assert.True(nhdobj.Entity.ID > 0);
            hid = nhdobj.Entity.ID;
            Assert.True(nhdobj.Entity.HomeMembers.Count == 1);
            Assert.True(nhdobj.Entity.HomeMembers.ElementAt(0).HomeID == nhdobj.Entity.ID);
            Assert.True(nhdobj.Entity.HomeMembers.ElementAt(0).Relation == HomeMemberRelationType.Self);
            Assert.True(nhdobj.Entity.HomeMembers.ElementAt(0).User == nhdobj.Entity.Host);

            // Read the single object
            var rst2           = control.Get(nhdobj.Entity.ID);
            var nreadobjectrst = Assert.IsType <SingleResult <HomeDefine> >(rst2);

            // Assert.Equal(nhdobj.Entity.Name, nreadobject.Queryable.)
            Assert.Equal(1, nreadobjectrst.Queryable.Count <HomeDefine>());
            var nreadobj = nreadobjectrst.Queryable.First <HomeDefine>();

            Assert.Equal(nhdobj.Entity.Name, nreadobj.Name);
            Assert.Equal(nhdobj.Entity.Host, nreadobj.Host);
            Assert.True(nreadobj.HomeMembers.Count == 1);
            Assert.True(nreadobj.HomeMembers.ElementAt(0).HomeID == nreadobj.ID);
            Assert.True(nreadobj.HomeMembers.ElementAt(0).Relation == HomeMemberRelationType.Self);
            Assert.True(nreadobj.HomeMembers.ElementAt(0).User == nreadobj.Host);

            // How to test the $expand? Test in integration test!

            // Change the home define - Add new user
            var hm2 = new HomeMember()
            {
                HomeID         = nreadobj.ID,
                Relation       = HomeMemberRelationType.Couple,
                DisplayAs      = "New Test",
                User           = (user == DataSetupUtility.UserA) ? DataSetupUtility.UserB : DataSetupUtility.UserA,
                HomeDefinition = nreadobj,
                Createdby      = user,
            };

            nreadobj.HomeMembers.Add(hm2);
            var rst3 = await control.Put(nreadobj.ID, nreadobj);

            var nupdobjectrst = Assert.IsType <UpdatedODataResult <HomeDefine> >(rst3);

            Assert.Equal(nreadobj.ID, nupdobjectrst.Entity.ID);
            //var memcnt = context.HomeMembers.Where(p => p.HomeID == nreadobj.ID).Count();
            //Assert.Equal(2, memcnt);
            Assert.Equal(2, nupdobjectrst.Entity.HomeMembers.Count);

            // Change the home define - change the host
            nreadobj.Host = hm2.User;
            homehost      = nreadobj.Host;
            // Need the relationship....
            foreach (var mem in nreadobj.HomeMembers)
            {
                if (mem.User == nreadobj.Host)
                {
                    mem.Relation = HomeMemberRelationType.Self;
                }
                else
                {
                    mem.Relation = HomeMemberRelationType.Couple;
                }
            }
            rst3 = await control.Put(nreadobj.ID, nreadobj);

            nupdobjectrst = Assert.IsType <UpdatedODataResult <HomeDefine> >(rst3);
            Assert.Equal(nreadobj.Host, nupdobjectrst.Entity.Host);
            Assert.Equal(2, nupdobjectrst.Entity.HomeMembers.Count);
            foreach (var mem in nupdobjectrst.Entity.HomeMembers)
            {
                if (mem.User == nupdobjectrst.Entity.Host)
                {
                    Assert.Equal(HomeMemberRelationType.Self, mem.Relation);
                }
                else
                {
                    Assert.NotEqual(HomeMemberRelationType.Self, mem.Relation);
                }
            }

            // Change the home define - remove one user
            var memtoremove = nreadobj.HomeMembers.First(p => p.Relation != HomeMemberRelationType.Self);

            nreadobj.HomeMembers.Remove(memtoremove);
            Assert.Equal(1, nreadobj.HomeMembers.Count);
            Assert.Equal(nreadobj.Host, nreadobj.HomeMembers.ElementAt(0).User);
            rst3 = await control.Put(nreadobj.ID, nreadobj);

            nupdobjectrst = Assert.IsType <UpdatedODataResult <HomeDefine> >(rst3);
            Assert.Equal(1, nupdobjectrst.Entity.HomeMembers.Count);

            // Delete the home define (failed case)
            try
            {
                await control.Delete(hid);
            }
            catch (Exception exp)
            {
                Assert.IsType <UnauthorizedAccessException>(exp);
            }

            // Switch to another user
            context = this.fixture.GetCurrentDataContext();
            var fakeCtgy = context.FinAccountCategories.Add(new FinanceAccountCategory()
            {
                HomeID  = hid,
                Name    = "Test 1",
                Comment = "Test 1"
            });
            await context.SaveChangesAsync();

            control   = new HomeDefinesController(context);
            userclaim = DataSetupUtility.GetClaimForUser(homehost);
            control.ControllerContext = new ControllerContext()
            {
                HttpContext = new DefaultHttpContext()
                {
                    User = userclaim
                }
            };

            // Delete the home define (failed case 2)
            try
            {
                await control.Delete(hid);
            }
            catch (Exception exp)
            {
                Assert.IsType <BadRequestException>(exp);
            }
            context.FinAccountCategories.Remove(fakeCtgy.Entity);
            await context.SaveChangesAsync();

            // Delete the home define (success case)
            var rst9 = await control.Delete(hid);

            var rst9rst = Assert.IsType <StatusCodeResult>(rst9);

            Assert.Equal(204, rst9rst.StatusCode);

            Assert.Equal(0, context.HomeDefines.Where(p => p.ID == hid).Count());

            await context.DisposeAsync();
        }