All files / src/infra GasClient.ts

0% Statements 0/41
0% Branches 0/1
0% Functions 0/5
0% Lines 0/40

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140                                                                                                                                                                                                                                                                                       
import path from "path";
import { Page } from "@playwright/test";
import { Browser, withBrowser } from "./Browser";
import { CommonEnv, Env } from "../Env";
import { FetchSettingModel, MonthlyUsageModel } from "../domain/Gas";
import Logger from "bunyan";
 
export class GasClient {
  readonly commonEnv: CommonEnv;
  readonly env: Env;
 
  constructor(commonEnv: CommonEnv, env: Env) {
    this.commonEnv = commonEnv;
    this.env = env;
  }
 
  async fetchMonthly(
    logger: Logger,
    setting: FetchSettingModel
  ): Promise<MonthlyUsageModel[]> {
    logger.info("fetch start");
    let usages: MonthlyUsageModel[] = [];
    try {
      await withBrowser(
        this.env.timeoutMs,
        async (browser: Browser): Promise<void> => {
          const page = await browser.newPage(logger);
 
          // ログインページに移動
          logger.info("goto login page");
          await page.goto(this.env.loginUrl);
          await page.locator("#divContent > div.divFrame01").waitFor();
          await page.screenshot({
            path: this.makeScreenshotPath("gas-01-login-page.png"),
            fullPage: true,
          });
 
          // ログイン
          logger.info("input id and password");
          await page
            .locator("#ContentPlaceHolder1_txtLoginID")
            .fill(setting.userName);
          await page
            .locator("#ContentPlaceHolder1_txtPassWord")
            .fill(setting.password.value());
          await page.screenshot({
            path: this.makeScreenshotPath("gas-02-login-page-with-id-pw.png"),
            fullPage: true,
          });
          logger.info("click login button");
          await page.locator("#ContentPlaceHolder1_btnLogin").click();
          logger.info("wait for loading top page");
          await page.locator("#tblLoginInfo").waitFor();
          await page.screenshot({
            path: this.makeScreenshotPath("gas-03-top-page.png"),
            fullPage: true,
          });
 
          // ガス料金を取得して保存
          const now = new Date();
          for (let beforeMonth = 0; beforeMonth < 5; beforeMonth++) {
            Iif (beforeMonth != 0) {
              logger.info("click before month button");
              await page.locator("#ContentPlaceHolder1_LinkButton1").click();
            }
 
            usages.push(
              await this.fetchByBeforeMonth(logger, setting, page, beforeMonth)
            );
          }
        }
      );
    } finally {
      logger.info("fetch end");
    }
    return usages;
  }
 
  async fetchByBeforeMonth(
    logger: Logger,
    setting: FetchSettingModel,
    page: Page,
    beforeMonth: number
  ): Promise<MonthlyUsageModel> {
    logger.info("wait for loading usage data, %d month ago", beforeMonth);
    const year = Number(
      (
        await page.locator("#ContentPlaceHolder1_lblNowYear").innerText()
      ).replace("年", "")
    );
    const month = Number(
      await page.locator("#ContentPlaceHolder1_lblNowMonth").innerText()
    );
    const beginAt =
      (
        await page
          .locator(
            "#ContentPlaceHolder1_tblWeb > tbody > tr:nth-child(5) > td.tblFrame01-td02-2"
          )
          .innerText()
      )
        .replace("年", "-")
        .replace("月", "-")
        .replace("日", "") + "T00:00:00.000Z";
    const endAt =
      (
        await page
          .locator(
            "#ContentPlaceHolder1_tblWeb > tbody > tr:nth-child(3) > td.tblFrame01-td02-2"
          )
          .innerText()
      )
        .replace("年", "-")
        .replace("月", "-")
        .replace("日", "") + "T00:00:00.000Z";
    const amount = Number(
      await page.locator("#ContentPlaceHolder1_lblUse").innerText()
    );
    const yen = Number(
      (
        await page.locator("#ContentPlaceHolder1_lblLpUsePrice").innerText()
      ).replace(",", "")
    );
 
    return {
      fetchSettingId: setting.id,
      year: year,
      month: month,
      begin: beginAt,
      end: endAt,
      amount: amount,
      yen: yen,
    };
  }
 
  private makeScreenshotPath(fileName: string): string {
    return path.join(this.env.screenshotDir, fileName);
  }
}