public EditSuperheroPage(SuperheroDetailsDTO superhero) { InitializeComponent(); _superhero = superhero; BindingContext = _viewModel = App.Container.GetRequiredService <SuperheroUpdateViewModel>(); }
public void EditCommand_calls_EditAsync_with_DTO() { var navigation = new Mock <INavigationService>(); var messaging = new Mock <IMessagingCenter>(); var detailsDTO = new SuperheroDetailsDTO { Id = 42, Name = "name", AlterEgo = "alterEgo", Occupation = "occupation", CityName = "cityName", PortraitUrl = "https://image.com/portrait.jpg", BackgroundUrl = "https://image.com/background.jpg", FirstAppearance = 2000, Gender = Gender.Male, Powers = new[] { "power1", "power2" } }; var client = new Mock <IRestClient>(); client.Setup(s => s.GetAsync <SuperheroDetailsDTO>("superheroes/42")).ReturnsAsync((HttpStatusCode.OK, detailsDTO)); var dialog = new Mock <IDialogService>(); var vm = new SuperheroDetailsViewModel(navigation.Object, messaging.Object, client.Object, dialog.Object); var listDTO = new SuperheroListDTO { Id = 42, AlterEgo = "alterEgo", Name = "name", PortraitUrl = "https://image.com/image.jpg" }; vm.LoadCommand.Execute(listDTO); vm.EditCommand.Execute(null); navigation.Verify(s => s.EditAsync(It.Is <SuperheroDetailsDTO>(h => h.Id == 42 && h.Name == "name" && h.AlterEgo == "alterEgo" && h.Occupation == "occupation" && h.CityName == "cityName" && h.PortraitUrl == "https://image.com/portrait.jpg" && h.BackgroundUrl == "https://image.com/background.jpg" && h.FirstAppearance == 2000 && h.Gender == Gender.Male && new HashSet <string> { "power1", "power2" }.SetEquals(h.Powers) ))); // Ensure not busy when command finished Assert.False(vm.IsBusy); }
private async Task ExecuteSaveCommand() { IsBusy = true; var powers = Powers?.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Trim()) ?? new string[0]; var superhero = new SuperheroUpdateDTO { Id = Id, Name = Name, AlterEgo = AlterEgo, Occupation = Occupation, CityName = CityName, PortraitUrl = PortraitUrl, BackgroundUrl = BackgroundUrl, FirstAppearance = FirstAppearance, Gender = Gender, Powers = new HashSet <string>(powers) }; try { var status = await _client.PutAsync($"superheroes/{Id}", superhero); if (status != HttpStatusCode.NoContent) { await _dialog.DisplayAlertAsync("Error", $"Error from api: {status}", "OK"); } else { var superheroDetailsDTO = new SuperheroDetailsDTO { Id = Id, Name = Name, AlterEgo = AlterEgo, Occupation = Occupation, CityName = CityName, PortraitUrl = PortraitUrl, BackgroundUrl = BackgroundUrl, FirstAppearance = FirstAppearance, Gender = Gender, Powers = superhero.Powers }; _messaging.Send(this, UpdateSuperhero, superheroDetailsDTO); await _navigation.CancelAsync(); } } catch (Exception e) { await _dialog.DisplayAlertAsync(e); } IsBusy = false; }
public void LoadCommand_populates_Superhero() { var navigation = new Mock <INavigationService>(); var messaging = new Mock <IMessagingCenter>(); var dialog = new Mock <IDialogService>(); var detailsDTO = new SuperheroDetailsDTO { Id = 42, Name = "name", AlterEgo = "alterEgo", Occupation = "occupation", CityName = "cityName", PortraitUrl = "https://image.com/portrait.jpg", BackgroundUrl = "https://image.com/background.jpg", FirstAppearance = 2000, Gender = Gender.Male, Powers = new[] { "power1", "power2" } }; var client = new Mock <IRestClient>(); client.Setup(s => s.GetAsync <SuperheroDetailsDTO>("superheroes/42")).ReturnsAsync((HttpStatusCode.OK, detailsDTO)); var vm = new SuperheroDetailsViewModel(navigation.Object, messaging.Object, client.Object, dialog.Object); var listDTO = new SuperheroListDTO { Id = 42, AlterEgo = "alterEgo", Name = "name", PortraitUrl = "https://image.com/image.jpg" }; vm.LoadCommand.Execute(listDTO); Assert.Equal(42, vm.Id); Assert.Equal("alterEgo", vm.AlterEgo); Assert.Equal("name", vm.Name); Assert.Equal("occupation", vm.Occupation); Assert.Equal("cityName", vm.CityName); Assert.Equal("https://image.com/portrait.jpg", vm.PortraitUrl); Assert.Equal("https://image.com/background.jpg", vm.BackgroundUrl); Assert.Equal(2000, vm.FirstAppearance); Assert.Equal(Gender.Male, vm.Gender); Assert.Collection(vm.Powers, s => Assert.Equal("power1", s), s => Assert.Equal("power2", s) ); // Ensure not busy when command finished Assert.False(vm.IsBusy); }
public async Task Get_given_existing_returns_superhero() { var superhero = new SuperheroDetailsDTO(); var repository = new Mock <ISuperheroRepository>(); repository.Setup(s => s.Read(42)).ReturnsAsync(superhero); var controller = new SuperheroesController(repository.Object); var actual = await controller.Get(42); Assert.Equal(superhero, actual.Value); }
public async Task Get_id_given_repository_returns_null_returns_NotFound() { var superhero = new SuperheroDetailsDTO(); var repository = new Mock <ISuperheroRepository>(); repository.Setup(m => m.ReadAsync(42)).ReturnsAsync(default(SuperheroDetailsDTO)); var logger = new Mock <ILogger <SuperheroesController> >(); var controller = new SuperheroesController(repository.Object, logger.Object); var result = await controller.Get(42); Assert.IsType <NotFoundResult>(result.Result); }
public async Task Get_id_returns_result_from_repository() { var superhero = new SuperheroDetailsDTO(); var repository = new Mock <ISuperheroRepository>(); repository.Setup(m => m.ReadAsync(42)).ReturnsAsync(superhero); var logger = new Mock <ILogger <SuperheroesController> >(); var controller = new SuperheroesController(repository.Object, logger.Object); var result = await controller.Get(42); Assert.Equal(superhero, result.Value); }
private void ExecuteLoadCommand(SuperheroDetailsDTO superhero) { IsBusy = true; Title = superhero.AlterEgo; Id = superhero.Id; Name = superhero.Name; AlterEgo = superhero.AlterEgo; PortraitUrl = superhero.PortraitUrl; Occupation = superhero.Occupation; CityName = superhero.CityName; Gender = superhero.Gender; FirstAppearance = superhero.FirstAppearance; BackgroundUrl = superhero.BackgroundUrl; Powers = string.Join(Environment.NewLine, superhero.Powers); IsBusy = false; }
private async Task ExecuteSaveCommand() { IsBusy = true; var powers = Powers?.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Trim()) ?? new string[0]; var superhero = new SuperheroUpdateDTO { Id = Id, Name = Name, AlterEgo = AlterEgo, Occupation = Occupation, CityName = CityName, PortraitUrl = PortraitUrl, BackgroundUrl = BackgroundUrl, FirstAppearance = FirstAppearance, Gender = Gender, Powers = new HashSet <string>(powers) }; await _client.PutAsync($"superheroes/{Id}", superhero); var superheroDetailsDTO = new SuperheroDetailsDTO { Id = Id, Name = Name, AlterEgo = AlterEgo, Occupation = Occupation, CityName = CityName, PortraitUrl = PortraitUrl, BackgroundUrl = BackgroundUrl, FirstAppearance = FirstAppearance, Gender = Gender, Powers = superhero.Powers }; _messaging.Send(this, UpdateSuperhero, superheroDetailsDTO); await _navigation.CancelAsync(); IsBusy = false; }
private void SetSuperhero(SuperheroDetailsDTO value) { _superhero = value; Title = _superhero.AlterEgo; Id = _superhero.Id; Name = _superhero.Name; AlterEgo = _superhero.AlterEgo; PortraitUrl = _superhero.PortraitUrl; Occupation = _superhero.Occupation; CityId = _superhero.CityId; CityName = _superhero.CityName; Gender = _superhero.Gender; FirstAppearance = _superhero.FirstAppearance; BackgroundUrl = _superhero.BackgroundUrl; Powers.Clear(); foreach (var power in _superhero.Powers) { Powers.Add(power); } }
public async Task EditAsync(SuperheroDetailsDTO superhero) { await _navigation.PushModalAsync(new NavigationPage(new EditSuperheroPage(superhero))); }