Bamieh/reflow

View on GitHub
packages/reflow-cassandra-connection/lib/connection/reflow/combination.js

Summary

Maintainability
A
3 hrs
Test Coverage
const globalID = require('../../util/global-id');

module.exports = models => ({
  insert(input) {
    const jobsByProjectID = new models.instance.jobsByProjectId({
      project_id: models.datatypes.Long.fromString(input.jobDetails.projectID || "6366977657833263104"),
      job_id: models.datatypes.Long.fromString(input.jobDetails.id),
      threads: input.jobDetails.numberOfThreads,
      flows: input.jobDetails.numberOfFlows,
      total_number_of_combinations: input.jobDetails.numberOfCombinations,
      combination_id: models.datatypes.Long.fromString(input.id),
      github: input.jobDetails.github,
      jenkins: input.jobDetails.jenkins,
      source_branch: input.jobDetails.sourceBranch,
      target_branch: input.jobDetails.targetBranch,
      combination_successes: input.passes,
      combination_failures: input.failures,
      combination_skipped: input.pending,
      combiantion_total: input.passes + input.failures + input.pending,
      start_at: input.jobDetails.startTime,
      combination_end_at: input.endTime,
      combination_start_at: input.startTime,
      tags: input.jobDetails.tags,
    });
    const combinationsByFlowId =  new models.instance.combinationsByFlowId({
      "flow_id": models.datatypes.Long.fromString(input.flowDetails.id),
      "combination_id": models.datatypes.Long.fromString(input.id),
      "combination_successes": input.passes,
      "combination_failures": input.failures,
      "combination_skipped": input.pending,
      "combination_total": input.passes + input.failures + input.pending,
      "start_at": input.startTime,
      "end_at": input.endTime,
    });
    const flowsByFlowId = new models.instance.flowsByFlowId({
      flow_id: models.datatypes.Long.fromString(input.flowDetails.id),
      flow_title: input.flowDetails.title,
      combination_id: models.datatypes.Long.fromString(input.id),
      combination_successes: input.passes,
      combination_failures: input.failures,
      combination_skipped: input.pending,
      combination_total: input.passes + input.failures + input.pending,
      total_number_of_flow_combinations: input.flowDetails.totalCombinations,
    });
    const flowsByJobId = new models.instance.flowsByJobId({
      job_id: models.datatypes.Long.fromString(input.jobDetails.id),
      flow_id: models.datatypes.Long.fromString(input.flowDetails.id),
      flow_title: input.flowDetails.title,
      combination_id: models.datatypes.Long.fromString(input.id),
      combination_successes: input.passes,
      combination_failures: input.failures,
      combination_skipped: input.pending,
      combination_total: input.passes + input.failures + input.pending,
      total_number_of_flow_combinations: input.flowDetails.totalCombinations,
    });

    return new Promise((resolve, reject) => {
      models.doBatch([
        jobsByProjectID.save({return_query: true}),
        combinationsByFlowId.save({return_query: true}),
        flowsByFlowId.save({return_query: true}),
        flowsByJobId.save({return_query: true}),
        ...input.suites.map(suite => {
          return new models.instance.suitesByCombinationId({
            combination_id: models.datatypes.Long.fromString(input.id),
            suite_id: models.timeuuid(),
            title: suite.title,
            level: suite.level,
            tests: suite.tests.map(test => ({
              combination_id: models.datatypes.Long.fromString(input.id),
              title: test.title,
              result: test.result,
              speed: test.speed,
              duration: test.duration,
              code: test.code,
              err: test.err,
              metadata: test.metadata,
            })),
          }).save({return_query: true});
        }),
      ], err => {
        if(err) return reject(err);
        resolve({
          flowID: globalID.encode('flow', input.flowDetails.id),
        });
      });
    });
  },

  getByFlowID(encodedFlowID, cursorInfo) {
    const flowID = globalID.decode(encodedFlowID).id;

    return models.instance.combinationsByFlowId.findAsync({
        flow_id: models.datatypes.Long.fromString(flowID),
      }).then(combinations => {
        return combinations.map(combination => {
          const combinationID = globalID.encode('combination', combination.combination_id.toJSON());
          return {
            node: {
              id: combinationID,
              passes: combination.combination_successes,
              pending: combination.combination_skipped,
              failures: combination.combination_failures,
              startTime: combination.start_at,
              endTime: combination.end_at,
              suites: {combinationID}
            }
          }
        });
      });
  }
})