[OutSystems]CI/CD Probeを微修正して、BDDFramework Client Sideのテストを抽出する

OutSystemsでCI/CDを実現するにあたって、BDDFrameworkで作成したユニットテストを自動抽出する部品として公式で推奨されているのが、ForgeにあるCI/CD Probe。
ところが、現時点 (CI/CD Probe V2.1.0) では、BDDFrameworkにのみ対応しており、BDDFramework Client Sideで作成したClient Actionのユニットテストには対応していない。

そこで、CI/CD Probeを微修正し、BDDFramework Client Sideで作成したテストを抽出する新しい部品を作ってみる。
CI/CD ProbeにはExpose REST APIが2つあるが、ScanBDDTestEndpointsを対象とする（もう1個あるが使わないので……）。

# 環境
Personal Environment(Version 11.17.0 (Build 36291))
Service Studio(Version 11.53.16)
CI/CD Probe (Version 2.1.0)

# アプリケーション・モジュールを用意
CI/CD Probeは、Forgeのコンポーネントなので直接手を入れたくない。そこでクローンしたモジュールを用意し、以降の対応を入れることにする。
## アプリケーションを作成
オリジナルのコンポーネントがTraditional Webなので、同じTraditional Webのアプリケーションを作成する。
（Reactive Web Appなどに載せ替えても良い）

名前はCI/CD ProbeClientSideとしておく。

## モジュールを作成
1. オリジナルのCI/CD ProbeのモジュールをService Studioで開く
2. Moduleメニュー > Cloneでクローンを作成
3. 名前をCloneOfCI_CDProbeからCI_CDProbeClientSideとかに変更
4. Publish
5. Publishしたモジュールは、Independent Modulesアプリケーションにあるので、これをMove moduleして作成しておいたアプリケーションへ移動（スクリーンショットでモジュール名の右側にある「→」アイコンクリックで移動先のアプリケーションを指定できる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/10fa88e8-bec5-eac3-4f64-f926f6d0a1e5.png)

# 実装の修正
## 全体像
ScanBDDTestEndpointsの実装は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0c3bce35-512a-d7c5-9570-5df6c558682d.png)

修正点は図中の
①テストアプリケーションからBDDFrameworkを参照しているモジュールを抽出する部分
②各モジュールからUI Flowを抽出する部分

## ①SQL要素 (GetBDDFramework_Consumers)
(System)モジュールのEntity、Espace_Referenceを使って、モジュールがBDDFrameworkを参照しているかどうかを判定している（WHERE EXISTSの内部）。
そこで、この部分を「'BDDFramework'」→「'BDDFrameworkClientSide'」と書き換えれば良い。

'BDDFrameworkCLientSide'という名前はService Studio上でView Dataすることで確認した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9ffc7d5f-6483-40ec-da53-bc47f20b04e9.png)

``` sql
SELECT {Espace}.[Version_Id], {Espace}.[Name], {Application}.[Name]
FROM {Espace} INNER JOIN
    {Module} on {Espace}.[Id] = {Module}.[Espace_Id] INNER JOIN
    {App_Definition_Module} on {Module}.[Id] = {App_Definition_Module}.[Module_Id] INNER JOIN
    {Application} on {App_Definition_Module}.[Application_Id] = {Application}.[Id]
WHERE EXISTS (
    SELECT 1
    FROM {Espace_Version}
    INNER JOIN {Espace_Reference} BDDReference ON {Espace_Version}.[Id] = BDDReference.[Consumer_Version_Id]
    WHERE {Espace_Version}.[Id] = {Espace}.[Version_Id]
    AND BDDReference.[Producer_Name] = 'BDDFrameworkClientSide'
)
AND (@ApplicationName = @EmptyString OR {Application}.[Name] = @ApplicationName)
AND {Espace}.[Is_Active] = 1 
```

## ②Action (GetWebScreenDetailsFromEspaceOML)
Action GetWebScreenDetailsFromEspaceOMLの実装を修正する。
具体的には、OutDocが提供するAction Section_3_2_GenerateWebScreenのパラメータIsNewRuntime=Falseの値をTrueに変える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7583e3af-f0d7-8309-da2e-3527e6903842.png)

なぜこの変更が必要になるかというと、IsNewRuntime=FalseはTraditional WebのUI Flowを抽出する設定であり、Reactive/MobileのUI Flowを抽出するにはIsNewRuntime=Trueにする必要があるため。

# 動作確認
例として、以下のようにシンプルなBDDFramework Client Side利用テストモジュールを作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7a5aef36-769e-4bb9-8379-c9749c361cc2.png)

アプリケーション名（CI/CD ProbeのScanBDDTestEndpointsを使うときはアプリケーション名を指定する）として、「BDDFrameworkClientSideSample」を指定するには以下のようにブラウザのアドレスバーに入力。

```
https://ホスト/CI_CDProbeClientSide/rest/v1/ScanBDDTestEndpoints?ApplicationName=BDDFrameworkClientSideSample
```

結果、以下のように正しい値が帰ってきた（結果はJSONなので、ブラウザの開発者ツールでパースしたものを表示している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/50e8e808-8e3a-debf-199b-dc08a1daf475.png)