public void UpdateTodo()
        {
            var repository = new InMemoryTodoRepository();

            var originalTodo = new TodoModel
            {
                completed = true,
                deadlineUtc = DateTime.UtcNow,
                moreDetails = "more",
                task = "task"
            };

            originalTodo = repository.Add(originalTodo);

            var updatedTodo = new TodoModel
            {
                id = originalTodo.id,
                completed = false,
                deadlineUtc = DateTime.Now,
                moreDetails = "more details",
                task = "task info"
            };

            repository.Update(updatedTodo).ShouldBeTrue();

            var updatedOriginal = repository.Get(originalTodo.id);
            updatedOriginal.id.ShouldEqual(updatedTodo.id);
            updatedOriginal.completed.ShouldEqual(updatedTodo.completed);
            updatedOriginal.deadlineUtc.ShouldEqual(updatedTodo.deadlineUtc);
            updatedOriginal.moreDetails.ShouldEqual(updatedTodo.moreDetails);
            updatedOriginal.task.ShouldEqual(updatedTodo.task);
        }
        public void GetTodo()
        {
            var todo = new TodoModel { task = "My task" };

            var repository = new InMemoryTodoRepository();
            repository.Add(todo);
            repository.Get(todo.id).ShouldEqual(todo);
        }
        public TodoModel Add(TodoModel item)
        {
            int id = Interlocked.Increment(ref _lastId);
            item.id = id;

            _data.Add(item);

            return item;
        }
        public bool Update(TodoModel item)
        {
            var entry = _data.FirstOrDefault(x => x.id == item.id);
            if (entry == null)
                return false;

            entry.completed = item.completed;
            entry.deadlineUtc = item.deadlineUtc;
            entry.moreDetails = item.moreDetails;
            entry.task = item.task;
            return true;
        }
        // POST api/todos
        public IHttpActionResult Post(TodoModel todo)
        {
            if (todo == null)
            {
                return BadRequest("Todo can't be null");
            }

            var addedTodo = _repository.Add(todo);
            var representation = _mapper.Map<TodoRepresentation>(addedTodo);

            return CreatedAtRoute("DefaultApi", new {representation.id }, representation);
        }
        public void SetIncrementedIdWhenAddingTodo()
        {
            var todo = new TodoModel {task = "My task"};

            var repository = new InMemoryTodoRepository();
            todo = repository.Add(todo);
            todo.id.ShouldEqual(1);

            todo = repository.Add(todo);
            todo.id.ShouldEqual(2);

            todo = repository.Add(todo);
            todo.id.ShouldEqual(3);
        }
        public void AddTodo()
        {
            var controller = new TodosController(_mockRepository.Object, Mapper.Engine);
            MockHelpers.SetupMockUrl(controller);

            TodoModel todo = new TodoModel
            {
                deadlineUtc = DateTime.UtcNow,
                completed = false,
                task = "Some task"
            };

            _mockRepository.Setup(x => x.Add(todo)).Returns(todo);

            var response = controller.Post(todo) as CreatedAtRouteNegotiatedContentResult<TodoRepresentation>;
            response.ShouldNotBeNull();
            response.RouteName.ShouldEqual("DefaultApi");
            response.RouteValues["id"].ShouldEqual(response.Content.id);
            AreEquivalent(todo, response.Content).ShouldBeTrue();

            _mockRepository.Verify(x => x.Add(todo), Times.Once());
        }
 /// <summary>
 /// Used to determine if the model and representations are equivalent
 /// </summary>
 /// <param name="model"></param>
 /// <param name="representation"></param>
 /// <returns></returns>
 private static bool AreEquivalent(TodoModel model, TodoRepresentation representation)
 {
     return
         model.id == representation.id &&
         model.completed == representation.completed &&
         model.deadlineUtc == representation.deadlineUtc &&
         model.moreDetails == representation.moreDetails &&
         model.task == representation.task;
 }
        public void UpdateTodoOnPut()
        {
            var controller = new TodosController(_mockRepository.Object, Mapper.Engine);

            var todo = new TodoModel
            {
                id = 5,
                task = "My task"
            };

            var updatedTodo = new TodoModel
            {
                id = 5,
                task = "Updated task"
            };

            _mockRepository.Setup(x => x.Update(updatedTodo)).Returns(true);

            var response = controller.Put(todo.id, updatedTodo) as OkResult;
            response.ShouldNotBeNull();

            _mockRepository.Verify(x => x.Update(updatedTodo), Times.Once);
        }
        public void GetTodo()
        {
            var controller = new TodosController(_mockRepository.Object, Mapper.Engine);

            TodoModel todo = new TodoModel
            {
                id = 3,
                deadlineUtc = DateTime.UtcNow,
                completed = false,
                task = "Some task"
            };

            _mockRepository.Setup(x => x.Get(todo.id)).Returns(todo);

            var response = controller.Get(todo.id) as OkNegotiatedContentResult<TodoRepresentation>;
            response.ShouldNotBeNull();
            AreEquivalent(todo, response.Content).ShouldBeTrue();
        }
        // PUT api/todos/5
        public IHttpActionResult Put(int id, TodoModel todo)
        {
            if (todo == null)
            {
                return BadRequest("Todo can't be null");
            }

            todo.id = id;
            bool updateResult = _repository.Update(todo);
            if (!updateResult)
            {
                return BadRequest(String.Format("Can't update todo with id {0}", id));
            }

            return Ok();
        }