main
  1using System;
  2using Machine.Specifications;
  3using Rhino.Mocks;
  4using solidware.financials.infrastructure;
  5using solidware.financials.messages;
  6using solidware.financials.windows.ui;
  7using solidware.financials.windows.ui.events;
  8using solidware.financials.windows.ui.presenters;
  9using solidware.financials.windows.ui.presenters.specifications;
 10
 11namespace specs.unit.ui.presenters
 12{
 13    public class AddNewIncomeViewModelSpecs
 14    {
 15        public class concern
 16        {
 17            Establish context = () =>
 18            {
 19                command_builder = Create.dependency<UICommandBuilder>();
 20
 21                sut = new AddNewIncomeViewModel(command_builder);
 22            };
 23
 24            static protected AddNewIncomeViewModel sut;
 25            static protected UICommandBuilder command_builder;
 26        }
 27
 28        public class when_clicking_the_cancel_button : concern
 29        {
 30            It should_invoke_the_cancel_command = () =>
 31            {
 32                cancel_command.received(x => x.Execute(sut));
 33            };
 34
 35            Establish context = () =>
 36            {
 37                cancel_command = Create.an<ObservableCommand>();
 38                command_builder.Stub(x => x.build<CancelCommand>(sut)).Return(cancel_command);
 39            };
 40
 41            Because of = () =>
 42            {
 43                sut.present();
 44                sut.Cancel.Execute(sut);
 45            };
 46
 47            static ObservableCommand cancel_command;
 48        }
 49
 50        public class when_clicking_the_add_button : concern
 51        {
 52            It should_invoke_the_add_command = () =>
 53            {
 54                add_command.received(x => x.Execute(sut));
 55            };
 56
 57            Establish context = () =>
 58            {
 59                add_command = Create.an<ObservableCommand>();
 60                command_builder.Stub(x => x.build<AddNewIncomeViewModel.AddIncomeCommand, IfFamilyMemberIsSelected<AddNewIncomeViewModel>>(sut)).Return(add_command);
 61            };
 62
 63            Because of = () =>
 64            {
 65                sut.present();
 66                sut.Add.Execute(sut);
 67            };
 68
 69            static ObservableCommand add_command;
 70        }
 71
 72        public class when_the_add_button_is_pressed
 73        {
 74            It should_push_a_message_to_the_service_bus = () =>
 75            {
 76                bus.received(x => x.publish(new AddIncomeCommandMessage
 77                                            {
 78                                                Amount = amount,
 79                                                PersonId = personId
 80                                            }));
 81            };
 82
 83            It should_close_the_dialog = () =>
 84            {
 85                closed.ShouldBeTrue();
 86            };
 87
 88            Establish context = () =>
 89            {
 90                bus = Create.dependency<ServiceBus>();
 91                state = Create.an<ApplicationState>();
 92                var person = new SelectedFamilyMember {id = personId};
 93                state.Stub(x => x.PullOut<SelectedFamilyMember>()).Return(person);
 94                presenter = Create.an<AddNewIncomeViewModel>();
 95                presenter.Stub(x => x.amount).Return(amount);
 96                presenter.Stub(x => x.close).Return(() => { closed = true; });
 97
 98                sut = new AddNewIncomeViewModel.AddIncomeCommand(bus, state);
 99            };
100
101            Because of = () =>
102            {
103                sut.run(presenter);
104            };
105
106            static AddNewIncomeViewModel.AddIncomeCommand sut;
107            static ServiceBus bus;
108            static AddNewIncomeViewModel presenter;
109            static decimal amount = 1000m;
110            static ApplicationState state;
111            static Guid personId = Guid.NewGuid();
112            static bool closed;
113        }
114    }
115}