Skip to content

Commit

Permalink
複数選択カスタムフィールドで、mappingsが設定されていた場合に正しく動作しない問題対処 #10
Browse files Browse the repository at this point in the history
  • Loading branch information
onozaty committed May 26, 2022
1 parent cf1fe12 commit 866aef9
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 5 deletions.
2 changes: 1 addition & 1 deletion README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ CSVファイルに記載された情報を読み込んで、Redmineにチケッ
入手したjarファイルを指定してアプリケーションを実行します。

```
java -jar redmine-issue-loader-2.4.0-all.jar config.json issues.csv
java -jar redmine-issue-loader-2.4.1-all.jar config.json issues.csv
```

第1引数が設定ファイル、第2引数がチケットの情報が書かれたCSVファイルとなります。
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Download the latest jar file (`redmine-issue-loader-x.x.x-all.jar`) from below.
Execute the application with the following command.

```
java -jar redmine-issue-loader-2.4.0-all.jar config.json issues.csv
java -jar redmine-issue-loader-2.4.1-all.jar config.json issues.csv
```

The first argument is the configuration file. The second argument will be the CSV file with the Issue information.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
Expand Down Expand Up @@ -75,12 +77,13 @@ private IssueRecord toIssueRecord(CSVRecord csvRecord) {

for (FieldSetting fieldSetting : config.getFields()) {

String value = convertValue(csvRecord.get(fieldSetting.getHeaderName()), fieldSetting);
String value = csvRecord.get(fieldSetting.getHeaderName());

FieldType fieldType = fieldSetting.getType();
switch (fieldType) {
case ISSUE_ID:

value = convertValue(value, fieldSetting);
primaryKey = new IssueId(Integer.parseInt(value));
break;

Expand All @@ -89,9 +92,13 @@ private IssueRecord toIssueRecord(CSVRecord csvRecord) {
// 複数選択の場合は文字列のリスト、それ以外は文字列
Object customFiledValue;
if (StringUtils.isNotEmpty(fieldSetting.getMultipleItemSeparator())) {
customFiledValue = StringUtils.split(value, fieldSetting.getMultipleItemSeparator());

customFiledValue = Stream.of(StringUtils.split(value, fieldSetting.getMultipleItemSeparator()))
.map(v -> convertValue(v, fieldSetting))
.collect(Collectors.toList());
} else {
customFiledValue = value;

customFiledValue = convertValue(value, fieldSetting);
}

CustomField customField = new CustomField(fieldSetting.getCustomFieldId(), customFiledValue);
Expand All @@ -106,6 +113,7 @@ private IssueRecord toIssueRecord(CSVRecord csvRecord) {

default:
// その他の項目は更新対象フィールドとして利用
value = convertValue(value, fieldSetting);
targetFieldsBuilder.field(fieldType, value);
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,64 @@ public class IssueLoadRunnerTest {
}
}

@Test
public void execute_新規作成_複数選択カスタムフィールド() throws URISyntaxException, IOException, InterruptedException {

try (MockWebServer server = new MockWebServer()) {

server.enqueue(new MockResponse().setBody("{\"issue\":{\"id\":1}}"));
server.enqueue(new MockResponse().setBody("{\"issue\":{\"id\":2}}"));
server.enqueue(new MockResponse().setBody("{\"issue\":{\"id\":3}}"));

server.start();

Path configPath =
Paths.get(IssueLoadRunnerTest.class.getResource("create-multiple_custom_fields.json").toURI());
Config config = Config.of(configPath);

// Mockに対してリクエスト送信するよう設定
config.setReadmineUrl(server.url("/").toString());

Path csvPath =
Paths.get(IssueLoadRunnerTest.class.getResource("issues-multiple_custom_fields.csv").toURI());

IssueLoadRunner runner = new IssueLoadRunner(System.out);
runner.execute(config, csvPath);

assertThat(server.getRequestCount()).isEqualTo(3);

// 1レコード目
{
RecordedRequest request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getHeader("X-Redmine-API-Key")).isEqualTo("apikey1234567890");
assertThat(request.getPath()).isEqualTo("/issues.json");
assertThat(request.getBody().readUtf8()).isEqualTo(
"{\"issue\":{\"project_id\":\"1\",\"subject\":\"xxx\",\"custom_fields\":[{\"id\":1,\"value\":[\"1\",\"2\"]},{\"id\":2,\"value\":[\"a\",\"b\"]}]}}");
}

// 2レコード目
{
RecordedRequest request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getHeader("X-Redmine-API-Key")).isEqualTo("apikey1234567890");
assertThat(request.getPath()).isEqualTo("/issues.json");
assertThat(request.getBody().readUtf8()).isEqualTo(
"{\"issue\":{\"project_id\":\"2\",\"subject\":\"yyy\",\"custom_fields\":[{\"id\":1,\"value\":[\"1\"]},{\"id\":2,\"value\":[\"b\"]}]}}");
}

// 3レコード目
{
RecordedRequest request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getHeader("X-Redmine-API-Key")).isEqualTo("apikey1234567890");
assertThat(request.getPath()).isEqualTo("/issues.json");
assertThat(request.getBody().readUtf8()).isEqualTo(
"{\"issue\":{\"project_id\":\"1\",\"subject\":\"zzz\",\"custom_fields\":[{\"id\":1,\"value\":[]},{\"id\":2,\"value\":[]}]}}");
}
}
}

@Test
public void execute_Basic認証() throws URISyntaxException, IOException, InterruptedException {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"mode": "CREATE",
"readmineUrl": "http://localhost",
"apiKey": "apikey1234567890",
"csvEncoding": "UTF-8",
"fields": [
{
"headerName": "Project",
"type": "PROJECT_ID",
"mappings": {
"プロジェクト1": 1,
"プロジェクト2": 2
}
},
{
"headerName": "Subject",
"type": "SUBJECT"
},
{
"headerName": "Field1",
"type": "CUSTOM_FIELD",
"customFieldId": 1,
"multipleItemSeparator": ";",
"mappings": {
"A": 1,
"B": 2,
"C": 3
}
},
{
"headerName": "Field2",
"type": "CUSTOM_FIELD",
"customFieldId": 2,
"multipleItemSeparator": "\t"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Project,Subject,Field1,Field2
プロジェクト1,xxx,A;B,a b
プロジェクト2,yyy,A,b
プロジェクト1,zzz,,

0 comments on commit 866aef9

Please sign in to comment.