private async Task PutIMEIToCallsign(int id, string callsign, string imei, VehicleType? type, ResultType expectedResult = ResultType.Success)
        {
            var logService = CreateMockLogService();
            var service = CreateMockIMEIService();
            var controller = new IMEIController(service.Object, logService.Object);
            var config = new Mock<HttpConfiguration>();
            var principal = MockHelpers.CreateMockPrincipal(TestUsername);

            controller.User = principal.Object;
            controller.Configuration = config.Object;

            var delta = new Delta<IMEIToCallsign>();
            if (!string.IsNullOrEmpty(imei))
                delta.TrySetPropertyValue("IMEI", imei);
            if (!string.IsNullOrEmpty(callsign))
                delta.TrySetPropertyValue("CallSign", callsign);
            if (type != null)
                delta.TrySetPropertyValue("Type", type);

            var res = await controller.Put(id, delta);

            switch (expectedResult)
            {
                case ResultType.ModelError:
                    Assert.IsType<InvalidModelStateResult>(res);
                    logService.Verify(l => l.LogIMEIRegistered(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<VehicleType>()), Times.Never);
                    break;

                case ResultType.NotFoundError:
                    Assert.IsType<NotFoundResult>(res);
                    logService.Verify(l => l.LogIMEIRegistered(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<VehicleType>()), Times.Never);
                    break;

                case ResultType.Success:
                    Assert.IsType<UpdatedODataResult<IMEIToCallsign>>(res);
                    service.Verify(i => i.RegisterCallsign(imei, callsign, type));
                    logService.Verify(l => l.LogIMEIRegistered(TestUsername, imei, callsign, type ?? VehicleType.Unknown));
                    break;
            }
        }
        private async Task DeleteCallsign(int id, string imei, bool shouldLog)
        {
            var service = CreateMockIMEIService();
            var logService = CreateMockLogService();
            var controller = new IMEIController(service.Object, logService.Object);
            var config = new Mock<HttpConfiguration>();
            var principal = MockHelpers.CreateMockPrincipal(TestUsername);

            controller.User = principal.Object;
            controller.Configuration = config.Object;

            var res = await controller.Delete(id);

            var result = res as StatusCodeResult;

            Assert.NotNull(result);

            Assert.Equal(HttpStatusCode.NoContent, result.StatusCode);

            if (shouldLog)
            {
                logService.Verify(l => l.LogIMEIDeleted(TestUsername, imei));
            }
        }
        private async Task PostIMEIToCallsign(string callsign, string imei, VehicleType type, ResultType expectedResult = ResultType.Success)
        {
            var service = CreateMockIMEIService();
            var logService = CreateMockLogService();
            var controller = new IMEIController(service.Object, logService.Object);
            var config = new Mock<HttpConfiguration>();
            var principal = MockHelpers.CreateMockPrincipal(TestUsername);

            controller.User = principal.Object;
            controller.Configuration = config.Object;

            var imeiToCallsign = new IMEIToCallsign
            {
                CallSign = callsign,
                IMEI = imei,
                Type = type
            };

            MockHelpers.Validate(imeiToCallsign, controller);

            var res = await controller.Post(imeiToCallsign);

            switch (expectedResult)
            {
                case ResultType.ModelError:
                    Assert.IsType<InvalidModelStateResult>(res);
                    logService.Verify(l => l.LogIMEIRegistered(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<VehicleType>()), Times.Never);
                    break;

                case ResultType.Success:
                    Assert.IsType<CreatedODataResult<IMEIToCallsign>>(res);
                    service.Verify(i => i.RegisterCallsign(imei, callsign, type));
                    logService.Verify(l => l.LogIMEIRegistered(TestUsername, imei, callsign, type));
                    break;
            }
        }
        private IMEIController CreateController()
        {
            var service = CreateMockIMEIService();
            var logService = CreateMockLogService();
            var controller = new IMEIController(service.Object, logService.Object);

            return controller;
        }