|
37 | 37 | import io.spine.core.Event;
|
38 | 38 | import io.spine.core.MessageId;
|
39 | 39 | import io.spine.core.TenantId;
|
| 40 | +import io.spine.environment.Tests; |
40 | 41 | import io.spine.server.BoundedContext;
|
41 | 42 | import io.spine.server.BoundedContextBuilder;
|
| 43 | +import io.spine.server.ContextSpec; |
| 44 | +import io.spine.server.ServerEnvironment; |
42 | 45 | import io.spine.server.aggregate.given.Given;
|
43 | 46 | import io.spine.server.aggregate.given.aggregate.AggregateWithMissingApplier;
|
44 | 47 | import io.spine.server.aggregate.given.aggregate.AmishAggregate;
|
|
48 | 51 | import io.spine.server.aggregate.given.aggregate.TaskAggregateRepository;
|
49 | 52 | import io.spine.server.aggregate.given.aggregate.TestAggregate;
|
50 | 53 | import io.spine.server.aggregate.given.aggregate.TestAggregateRepository;
|
| 54 | +import io.spine.server.aggregate.given.salary.Employee; |
51 | 55 | import io.spine.server.aggregate.given.salary.EmployeeAgg;
|
| 56 | +import io.spine.server.aggregate.given.salary.PreparedInboxStorage; |
| 57 | +import io.spine.server.aggregate.given.salary.event.NewEmployed; |
52 | 58 | import io.spine.server.aggregate.given.thermometer.SafeThermometer;
|
53 | 59 | import io.spine.server.aggregate.given.thermometer.SafeThermometerRepo;
|
54 | 60 | import io.spine.server.aggregate.given.thermometer.Thermometer;
|
55 | 61 | import io.spine.server.aggregate.given.thermometer.ThermometerId;
|
56 | 62 | import io.spine.server.aggregate.given.thermometer.event.TemperatureChanged;
|
| 63 | +import io.spine.server.delivery.DeliveryStrategy; |
| 64 | +import io.spine.server.delivery.InboxStorage; |
57 | 65 | import io.spine.server.delivery.MessageEndpoint;
|
58 | 66 | import io.spine.server.model.ModelError;
|
| 67 | +import io.spine.server.storage.RecordSpec; |
| 68 | +import io.spine.server.storage.RecordStorage; |
| 69 | +import io.spine.server.storage.StorageFactory; |
| 70 | +import io.spine.server.storage.memory.InMemoryStorageFactory; |
59 | 71 | import io.spine.server.type.CommandClass;
|
60 | 72 | import io.spine.server.type.CommandEnvelope;
|
61 | 73 | import io.spine.server.type.EventClass;
|
|
80 | 92 | import io.spine.test.aggregate.event.AggUserNotified;
|
81 | 93 | import io.spine.test.aggregate.rejection.Rejections.AggCannotReassignUnassignedTask;
|
82 | 94 | import io.spine.testing.logging.mute.MuteLogging;
|
83 |
| -import io.spine.testing.server.blackbox.BlackBox; |
84 | 95 | import io.spine.testing.server.blackbox.ContextAwareTest;
|
85 | 96 | import io.spine.testing.server.model.ModelTests;
|
86 | 97 | import io.spine.time.testing.BackToTheFuture;
|
87 | 98 | import io.spine.time.testing.FrozenMadHatterParty;
|
| 99 | +import io.spine.type.TypeUrl; |
88 | 100 | import org.junit.jupiter.api.AfterEach;
|
89 | 101 | import org.junit.jupiter.api.BeforeEach;
|
90 | 102 | import org.junit.jupiter.api.DisplayName;
|
|
100 | 112 | import static com.google.common.collect.Lists.newArrayList;
|
101 | 113 | import static com.google.common.truth.Truth.assertThat;
|
102 | 114 | import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
|
| 115 | +import static io.spine.base.Identifier.newUuid; |
103 | 116 | import static io.spine.grpc.StreamObservers.noOpObserver;
|
104 | 117 | import static io.spine.protobuf.AnyPacker.unpack;
|
105 | 118 | import static io.spine.server.aggregate.given.Given.EventMessage.projectCreated;
|
|
113 | 126 | import static io.spine.server.aggregate.given.aggregate.AggregateTestEnv.newTenantId;
|
114 | 127 | import static io.spine.server.aggregate.given.aggregate.AggregateTestEnv.reassignTask;
|
115 | 128 | import static io.spine.server.aggregate.given.dispatch.AggregateMessageDispatcher.dispatchCommand;
|
| 129 | +import static io.spine.server.aggregate.given.salary.Employees.decreaseSalary; |
116 | 130 | import static io.spine.server.aggregate.given.salary.Employees.employ;
|
| 131 | +import static io.spine.server.aggregate.given.salary.Employees.increaseSalary; |
117 | 132 | import static io.spine.server.aggregate.given.salary.Employees.newEmployee;
|
118 | 133 | import static io.spine.server.aggregate.given.salary.Employees.shakeUpSalary;
|
119 | 134 | import static io.spine.server.aggregate.model.AggregateClass.asAggregateClass;
|
@@ -468,26 +483,119 @@ void addEventsToUncommittedOnlyIfApplied() {
|
468 | 483 | @Test
|
469 | 484 | @DisplayName("add events to `UncommittedHistory` only if they were successfully applied")
|
470 | 485 | void addEventsToUncommittedOnlyIfApplied2() {
|
471 |
| - var repository = new DefaultAggregateRepository<>(EmployeeAgg.class); |
472 |
| - var context = BlackBox.from( |
473 |
| - BoundedContextBuilder.assumingTests() |
474 |
| - .add(repository) |
| 486 | + var jack = newEmployee(); |
| 487 | + var shardIndex = DeliveryStrategy.newIndex(0, 1); |
| 488 | + var inboxStorage = PreparedInboxStorage.withCommands( |
| 489 | + shardIndex, |
| 490 | + TypeUrl.of(Employee.class), |
| 491 | + command(employ(jack, 250)), |
| 492 | + command(shakeUpSalary(jack)) |
475 | 493 | );
|
476 |
| - repository.aggregateStorage().enableStateQuerying(); |
477 | 494 |
|
| 495 | + System.out.println("Setting storage factory ..."); |
| 496 | + ServerEnvironment.instance().reset(); |
| 497 | + ServerEnvironment.when(Tests.class) |
| 498 | + .use(new StorageFactory() { |
| 499 | + @Override |
| 500 | + public <I, R extends Message> RecordStorage<I, R> createRecordStorage( |
| 501 | + ContextSpec context, RecordSpec<I, R, ?> spec) { |
| 502 | + return InMemoryStorageFactory.newInstance().createRecordStorage(context, spec); |
| 503 | + } |
| 504 | + |
| 505 | + @Override |
| 506 | + public InboxStorage createInboxStorage(boolean multitenant) { |
| 507 | + return inboxStorage; |
| 508 | + } |
| 509 | + |
| 510 | + @Override |
| 511 | + public void close() { |
| 512 | + // NO OP |
| 513 | + } |
| 514 | + }); |
| 515 | + |
| 516 | + var repository = new DefaultAggregateRepository<>(EmployeeAgg.class); |
| 517 | + BoundedContextBuilder.assumingTests() |
| 518 | + .add(repository) |
| 519 | + .build(); |
| 520 | + |
| 521 | + System.out.println(ServerEnvironment.instance().type()); |
| 522 | + System.out.println(ServerEnvironment.instance().storageFactory().createInboxStorage(false)); |
| 523 | + |
| 524 | + var stats = ServerEnvironment |
| 525 | + .instance() |
| 526 | + .delivery() |
| 527 | + .deliverMessagesFrom(shardIndex) |
| 528 | + .orElseThrow(); |
| 529 | + System.out.println(stats.deliveredCount()); |
| 530 | +// ServerEnvironment.instance().reset(); |
| 531 | + |
| 532 | + var storedEvents = repository.aggregateStorage() |
| 533 | + .read(jack) |
| 534 | + .orElseThrow() |
| 535 | + .getEventList(); |
| 536 | + |
| 537 | + assertThat(storedEvents.size()).isEqualTo(1); |
| 538 | + assertThat(storedEvents.get(0).enclosedMessage().getClass()).isEqualTo(NewEmployed.class); |
| 539 | + } |
| 540 | + |
| 541 | + @Test |
| 542 | + @DisplayName("add events to `UncommittedHistory` only if they were successfully applied") |
| 543 | + void addEventsToUncommittedOnlyIfApplied3() { |
478 | 544 | var jack = newEmployee();
|
479 |
| - context.tolerateFailures() |
480 |
| - .receivesCommands( |
481 |
| - employ(jack, 2150), |
482 |
| - shakeUpSalary(jack) |
483 |
| - ); |
| 545 | + var shardIndex = DeliveryStrategy.newIndex(0, 1); |
| 546 | + var inboxStorage = PreparedInboxStorage.withCommands( |
| 547 | + shardIndex, |
| 548 | + TypeUrl.of(Employee.class), |
| 549 | + command(employ(jack, 250)), |
| 550 | + command(decreaseSalary(jack, 15)), |
| 551 | + command(decreaseSalary(jack, 500)), |
| 552 | + command(increaseSalary(jack, 500)) |
| 553 | + ); |
| 554 | + |
| 555 | + System.out.println("Setting storage factory ..."); |
| 556 | + ServerEnvironment.instance().reset(); |
| 557 | + ServerEnvironment.when(Tests.class) |
| 558 | + .use(new StorageFactory() { |
| 559 | + @Override |
| 560 | + public <I, R extends Message> RecordStorage<I, R> createRecordStorage( |
| 561 | + ContextSpec context, RecordSpec<I, R, ?> spec) { |
| 562 | + return InMemoryStorageFactory.newInstance().createRecordStorage(context, spec); |
| 563 | + } |
| 564 | + |
| 565 | + @Override |
| 566 | + public InboxStorage createInboxStorage(boolean multitenant) { |
| 567 | + return inboxStorage; |
| 568 | + } |
| 569 | + |
| 570 | + @Override |
| 571 | + public void close() { |
| 572 | + // NO OP |
| 573 | + } |
| 574 | + }); |
| 575 | + |
| 576 | + var repository = new DefaultAggregateRepository<>(EmployeeAgg.class); |
| 577 | + BoundedContextBuilder.assumingTests() |
| 578 | + .add(repository) |
| 579 | + .build(); |
| 580 | + |
| 581 | + System.out.println(ServerEnvironment.instance().type()); |
| 582 | + System.out.println(ServerEnvironment.instance().storageFactory().createInboxStorage(false)); |
| 583 | + |
| 584 | + var stats = ServerEnvironment |
| 585 | + .instance() |
| 586 | + .delivery() |
| 587 | + .deliverMessagesFrom(shardIndex) |
| 588 | + .orElseThrow(); |
| 589 | + System.out.println(stats.deliveredCount()); |
| 590 | +// ServerEnvironment.instance().reset(); |
484 | 591 |
|
485 | 592 | var storedEvents = repository.aggregateStorage()
|
486 | 593 | .read(jack)
|
487 | 594 | .orElseThrow()
|
488 | 595 | .getEventList();
|
489 | 596 |
|
490 | 597 | assertThat(storedEvents.size()).isEqualTo(1);
|
| 598 | + assertThat(storedEvents.get(0).enclosedMessage().getClass()).isEqualTo(NewEmployed.class); |
491 | 599 | }
|
492 | 600 |
|
493 | 601 | @Nested
|
|
0 commit comments