topmonks / hlidac-shopu

Hlídač shopů
https://www.hlidacshopu.cz
Other
66 stars 30 forks source link

Testování actorů #819

Open rarous opened 2 years ago

rarous commented 2 years ago

Pro potřeby CI a CD potřebujeme v každém actoru vytvořit npm script test, který:

Běh testu je primárně určen pro CI, kde je linux. Běh na Windows není prioritou.

Dále je potřeba projít všechny actory a zajistit, aby:

ENV TEST slouží k deaktivaci uploadu dat do Kebooly a data.hlidacshopu.cz

junkycoder commented 2 years ago

Zatím jsem přidal common script pro test actora a updatnul jsem všechny actory aby jej používali.

Ještě musím vyřešit chybějící apify storage local soubory kde je i ten INPUT.json. Zkoušel jsem je vygenerovat přes apify init, ale to mění i .gitignore daného actoru. Opravim to jedoduše tak že ten chybějící INPUT vč ev. složek nad ním vytořim v to scriptu co test spouští.

junkycoder commented 2 years ago

Add přednastavení input.testUrl - to by musel mít každý actor někde definovanou takovou prop. Cesta kde je INPUT.json uloženej je v gitu ignorovaná, takže na CI nikdy nebude dokud ji script pro test nevytvoří. Nevím teda kde z tohodle scriptu zjistit, jakou testUrl do generovaného INPUT.json vložit.

rarous commented 2 years ago

@junkycoder všichni aktoři mají něco takového:

  const input = await Apify.getInput();
  const { debug = false, country = COUNTRY.CZ, type = "FULL" } = input ?? {};

a to je to místo, kde by to mělo být:

  const input = await Apify.getInput();
  const { debug = false, country = COUNTRY.CZ, type = ActorType.FULL, testUrl = "https://example.com/"} = input ?? {};

Tj. je tam default hodnota definovaná actorem a jde přepsat inputem.

junkycoder commented 2 years ago

Uff, prolezl jsem všechny jen abych to učesal - https://github.com/topmonks/hlidac-shopu/commit/fb8ab40c0c5f0a2e1310d25a9085a36f4d630289 - a sepsal si poznámky:

const ActorType = {
  BF: "BF",
  FULL: "FULL",
  TEST: "TEST"
};

Bordel v input typech. Nově používáme tyhle tři, ale některé aktory mají svoje extra typy.

// tsbohemia-daily
export const LABELS = {
  START: "START",
  BF: "BF",
  PAGE: "PAGE",
  PRICE: "PRICE"
};

// alza-daily
const TYPE = {
  FULL: "FULL",
  TRHAK: "TRHAK",
  FEED: "FEED",
  BLACK_FRIDAY: "BF",
  TEST: "TEST"
};

// conrad-daily
export const LABELS = {
  API_START: "API-START",
  API_LIST: "API-LIST",
  API_DETAIL: "API-DETAIL",

  SITEMAP_START: "SITEMAP-START",
  SITEMAP_LIST: "SITEMAP-LIST"
};

// datart-daily
const LABELS = {
  START: "START",
  CATEGORY: "CATEGORY",
  CATEGORY_NEXT: "CATEGORY_NEXT",
  BF: "BF"
};
type === "COUNT" // ??

// dek-daily
// proč je main.js v src? Proč vůbec existuje src dir ve všech aktorech?

// e-coop-daily
// nemá žádný input.type

// electroworld-daily
type === "DETAIL"
type === "COUNT"
type === "TEST_FULL"
type === "FULL" || type === "TEST_FULL"

// eva-daily
type === "FULL" || type === "COUNT"
type === "COUNT" ? "COUNT" : "CATEGORY",
!development && type !== "COUNT"

// hornbach-daily
// zase main v src a žádný typ
// jakej je vztah mezi LABEL a TYPE?
export const LABELS = {
  SITE: "SITE",
  CATEGORY: "CATEGORY"
};

// hs-reviews
// žádný typ a extra main.test.mjs file, tohle bude první pokud o testování a měl by bejt nahrazenej ActorType.TEST?

// iglobus-daily
// žádný typ

// ikea-daily
// main v src
type = "DAILY"
type === "DAILY"
type === "COUNT"

// itesco-daily
// 👌

// kasa-count
// žádné typy, ale používájí se LABELS - LIST a DETAIL

// kasa-daily
request.userData.label === "START"
request.userData.label === "LAST_CATEGORY_PAGE"
label: "LAST_CATEGORY"
request.userData.label === "SUB_CATEGORY"
request.userData.label === "MAIN_CATEGORY"
request.userData.label === LAST_CATEGORY
// takže jakej je rozdíl mezi type a label?

// knihydobrovsky-count
// žádný type ale label
switch (label) {
  case "LIST":
  case "SUBLIST":

// knihydobrovsky-daily
// typy plus labels
label: "LIST"
label: "SUBLIST"

// kosik-daily
// pouze BF type, přidal jsem FULL jako default

// lekarna-daily
// FULL a BF typy plus labely
request.userData.label === "SUB_CATEGORY"
request.userData.label === "PAGE"
request.userData.label === "PAGI_PAGE"
request.userData.label === "START"

// lidl-daily
// zase main v src, tohle dělá Lukáš pořád
// použit pouze BF typ a mraky labelů
switch (label) 
  case LABELS.DETAIL
  case LABELS.LIDL_SHOP
  case LABELS.LIDL_SHOP_CAT
  case LABELS.LIDL_SHOP_DETAIL
  case LABELS.LIDL_SHOP_MAIN_CAT
  case LABELS.LIDL_SHOP_SECTION
  case LABELS.MAIN_NABIDKA
  case LABELS.MAIN_NABIDKA_CAT

// luxor-daily
// tady se label == type a bůbec ten actor vypadá jinak než ostatní, proč?
type = LABELS.API_START, // API_START | FRONT_START | SITEMAP_START

const LABELS = {
  API_START: "API-START",
  API_LIST: "API-LIST",
  API_DETAIL: "API-DETAIL",

  FRONT_START: "FRONT-START",
  FRONT_LIST: "FRONT-LIST",
  FRONT_DETAIL: "FRONT-DETAIL",

  SITEMAP_START: "SITEMAP-START",
  SITEMAP_LIST: "SITEMAP-LIST"
};
switch (priceList[priceIx].type) {
  case "RECOMMENDED":
  case "SALE":

// makro-daily
// žádné typy, pouze labels
label: "START"
case "LIST":
case "PAGE":

// mall-daily
// klasické typy a jeden extra navíc plus labely
type === "CZECHITAS"
label: "PAGE"
label: "START"
label: "CZECHITAS-START"
label: "MAP"
label: "REVIEW",

// megaknihy-daily
// zase main v src a žádný type
switch (label)
case "START":
case "PAGE":

// mironet-daily
// základní typy a cizí labely
label: "page"
label: "category"
label: "page"
label: "category_vyprodej"
label: "pages"

// mountfield-daily
// main v src, LABELS consts :(, ale typy jsou (bf, full a test)
export const LABELS = {
  MAIN_NABIDKA: "MAIN_NABIDKA",
  MAIN_NABIDKA_CAT: "MAIN_NABIDKA_CAT",
  DETAIL: "DETAIL",
  LIDL_SHOP: "LIDL_SHOP",
  LIDL_SHOP_MAIN_CAT: "LIDL_SHOP_MAIN_CAT",
  LIDL_SHOP_CAT: "LIDL_SHOP_CAT",
  LIDL_SHOP_DETAIL: "LIDL_SHOP_DETAIL",
  LIDL_SHOP_SECTION: "LIDL_SHOP_SECTION"
};

// mp-daily
// Žádné type, ale LABELS konstanta se tahá z contextu, wtf?
 const crawlContext = await init();
 const { input, requestQueue, log, LABELS } = crawlContext;

// notino-daily
type !== "CZECHITAS"
label: BF
{ label: HOME_PAGE }
{ label: CATEGORY_PAGE }

// obi-daily
// no type just labels
label: "LIST"
label: "DETAIL"
label: "START"
label: label + "I"  // WTF?
label.includes("SUBCAT") // fuck

// okay-daily
// Using ActorType now
const LABEL = {
  COLLECTION: "COLLECTION",
  COLLECTIONS: "COLLECTIONS",
  LIST: "LIST"
};

// pilulka-daily
// zahrabanej main v src
// Používa je BF, FULL jako default

// prozdravi-daily
// main v src
export const LABELS = {
  START: "START",
  PRODUCTS: "PRODUCTS",
  // BF: "BF" removed
};

// rohlik-daily
// type nepoužit
label: "main"
label: "list"
label: "PAGE"

// rozetka-daily
// routes? To je asi SPA
// ActorType nema DAILY ani COUNT, nechávám zatím být
export const ACTOR_TYPES = {
  DAILY: "DAILY",
  COUNT: "COUNT"
};
export const LABELS = {
  MAIN_PAGE: "MAIN_PAGE",
  CATEGORY_OR_PRODUCTS: "CATEGORY_OR_PRODUCTS"
};

// sleky-daily
// tady se místo type použivá mode (?)
mode === "LIST"
mode === "DETAIL"

// tetadrogerie-daily
// konečně actor bez zbytečných src/*

// tchibo-daily
// nepoužíva type, jen labels
const LABELS = {
  NAVIGATION: "NAVIGATION",
  CATEGORY: "CATEGORY",
  CATEGORY_CAT: "CATEGORY_CAT",
  COFFEE_CATEGORY: "COFFEE_CATEGORY",
  LIST: "LIST"
};

// tsbohemia-daily
// border v tom že label se chová jako type 
export const LABELS = {
  START: "START",
  BF: "BF",
  PAGE: "PAGE",
  PRICE: "PRICE"
};

- } else if (type === "test") {
+ } else if (type === ActorType.TEST) {

type === LABELS.PRICE
rarous commented 2 years ago

Pozor, LABEL je něco jinýho než TYPE. TYPE určuje v jakém módu jede celý actor. LABEL je konkrétní krok scraperu

junkycoder commented 2 years ago

Ano, ale použitý je to často jako jedno a to samé. Musíme to roztrhnout, aby to labels nechodily hodnoty z type a obráceně..

rarous commented 2 years ago

Ok

On Wed, Mar 23, 2022 at 11:50 AM Dan Hromada @.***> wrote:

Ano, ale použitý je to často jako jedno a to samé. Musíme to roztrhnout, aby to labels nechodily hodnoty z type a obráceně..

— Reply to this email directly, view it on GitHub https://github.com/topmonks/hlidac-shopu/issues/819#issuecomment-1076223740, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAYZTOGPOXCYLZHBZO5TB3VBLZN7ANCNFSM5RHZJTHA . You are receiving this because you authored the thread.Message ID: @.***>