View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2012-2026 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.jcabi.dynamo;
6   
7   import com.jcabi.dynamo.mock.MadeTable;
8   import com.jcabi.dynamo.retry.ReRegion;
9   import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;
10  import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;
11  import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement;
12  import software.amazon.awssdk.services.dynamodb.model.KeyType;
13  import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;
14  import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;
15  
16  /**
17   * Mock of a {@link Region}.
18   * @since 0.16.2
19   */
20  final class RegionMock {
21  
22      /**
23       * Dynamo table hash key.
24       */
25      private final transient String ahash;
26  
27      /**
28       * Dynamo table range key.
29       */
30      private final transient String arrange;
31  
32      /**
33       * DynamoDB Local port.
34       */
35      private final transient int prt;
36  
37      /**
38       * Ctor.
39       */
40      RegionMock() {
41          this(
42              "hash-key",
43              "range-key",
44              Integer.parseInt(
45                  System.getProperty("failsafe.port")
46              )
47          );
48      }
49  
50      /**
51       * Ctor.
52       * @param hash Hash
53       * @param range Range
54       * @param port Port
55       */
56      RegionMock(final String hash, final String range, final int port) {
57          this.ahash = hash;
58          this.arrange = range;
59          this.prt = port;
60      }
61  
62      /**
63       * Get DynamoDB server port.
64       * @return TCP port
65       */
66      public int port() {
67          return this.prt;
68      }
69  
70      /**
71       * Get hash of the table.
72       * @return Hash attribute name
73       */
74      public String hash() {
75          return this.ahash;
76      }
77  
78      /**
79       * Get range of the table.
80       * @return Hash attribute name
81       */
82      public String range() {
83          return this.arrange;
84      }
85  
86      /**
87       * Get region with a table.
88       * @param table Table name
89       * @return Region
90       * @throws Exception If fails
91       */
92      public Region get(final String table) throws Exception {
93          final Region region = new Region.Simple(
94              new Credentials.Direct(Credentials.TEST, this.prt)
95          );
96          final MadeTable mocker = new MadeTable(
97              region,
98              CreateTableRequest.builder()
99                  .tableName(table)
100                 .provisionedThroughput(
101                     ProvisionedThroughput.builder()
102                         .readCapacityUnits(1L)
103                         .writeCapacityUnits(1L)
104                         .build()
105                 )
106                 .attributeDefinitions(
107                     AttributeDefinition.builder()
108                         .attributeName(this.ahash)
109                         .attributeType(ScalarAttributeType.S)
110                         .build(),
111                     AttributeDefinition.builder()
112                         .attributeName(this.arrange)
113                         .attributeType(ScalarAttributeType.N)
114                         .build()
115                 )
116                 .keySchema(
117                     KeySchemaElement.builder()
118                         .attributeName(this.ahash)
119                         .keyType(KeyType.HASH)
120                         .build(),
121                     KeySchemaElement.builder()
122                         .attributeName(this.arrange)
123                         .keyType(KeyType.RANGE)
124                         .build()
125                 )
126                 .build()
127         );
128         mocker.create();
129         mocker.createIfAbsent();
130         return new ReRegion(region);
131     }
132 
133 }