Automatic Random Test Data Generation of Documents for Seeding a MongoDB Database

Tags: , , , ,



I’m using JSON Generator https://next.json-generator.com to seed my MongoDB database. I’m finding trouble to generate a random set (from one to six) of colors out of the predefined group.

I’ve succeeded to generate all of the other property values but color. I need for the availableColors key to generate a random variable number of colors out of a predefined set of six: “blue”, “brown”, “green”, “white”, “yellow”, “gray”.

Here is the URL to the online generator where it is possible to real-time edit it: https://next.json-generator.com/E1g60a1pL

Here is the code:

[
  {
    'repeat(5, 10)': {
      id: '{{objectId()}}',
      name: '{{firstName()}}',
      price: '{{floating(5, 4000, 2, "$0,0.00")}}',
      availableColors: (colors) => {
               var condition = '{{integer(1, 6)}}';
               var color = [];
               for (j = 0; j < condition+1; j++)
               {color [j] = '{{random("blue", "brown", "green",  "white", "yellow", "gray")}}';}
               let unique_array = [];
               for(let i = 0;i < color.length; i++) {
                   if(unique_array.indexOf(color[i]) == -1){
                      unique_array.push(color[i]);
                }
               }
               return unique_array;
},
      weight: '{{floating(1, 4000, 2, "0.00")}}',
      inStock: '{{integer(0, 2000)}}'
    }
  }
]

Here is the result I get:

[
  {
    "id": "5ce82b1302c9777aac5fd681",
    "name": "Blake",
    "price": "$389.53",
    "availableColors": [],
    "weight": "3753.22",
    "inStock": 449
  },
  {
    "id": "5ce82b137ab9fe24eda22714",
    "name": "Felicia",
    "price": "$3,190.01",
    "availableColors": [],
    "weight": "3797.51",
    "inStock": 1288
  },
  {
    "id": "5ce82b135414eb7550aee368",
    "name": "Bettye",
    "price": "$227.41",
    "availableColors": [],
    "weight": "2182.52",
    "inStock": 1288
  },
  {
    "id": "5ce82b13f751e63a8506fbf2",
    "name": "Mullen",
    "price": "$3,306.81",
    "availableColors": [],
    "weight": "694.51",
    "inStock": 821
  },
  {
    "id": "5ce82b130544c7c08086a6bc",
    "name": "Angelita",
    "price": "$734.90",
    "availableColors": [],
    "weight": "3.44",
    "inStock": 226
  },
  {
    "id": "5ce82b130d9e2fc4c2a21e22",
    "name": "Mcknight",
    "price": "$3,582.76",
    "availableColors": [],
    "weight": "1183.82",
    "inStock": 1917
  },
  {
    "id": "5ce82b13fb509ee9c384a096",
    "name": "Nannie",
    "price": "$3,479.29",
    "availableColors": [],
    "weight": "754.85",
    "inStock": 716
  },
  {
    "id": "5ce82b13881cb29ec7a1772b",
    "name": "Sutton",
    "price": "$1,726.83",
    "availableColors": [],
    "weight": "1382.76",
    "inStock": 1911
  },
  {
    "id": "5ce82b1386ad13bffcf0923b",
    "name": "Maria",
    "price": "$1,679.58",
    "availableColors": [],
    "weight": "1106.28",
    "inStock": 5
  },
  {
    "id": "5ce82b13fccd87dbe6451971",
    "name": "Noble",
    "price": "$309.25",
    "availableColors": [],
    "weight": "1657.83",
    "inStock": 235
  }
]

I expect the “availableColors” of any document to be an array of one to six predefined colors. Any idea?

Answer

After having studied in deep the example provided in the home page of JSON Generator, I’ve found how to use its keywords to get the same result. By the way, following the schema of my document, I’ve added the way to randomly provide or not the value for all of the properties that are not required.

Here’s the URL to the online editor: https://next.json-generator.com/4k8Wd87pU

Here is the code:

[{
  'repeat(5, 10)': {
    id: '{{objectId()}}',
    name: '{{firstName()}}',
    price(tags) {
      const nRequired = tags.integer(0, 5);
      if (nRequired) {
        return tags.floating(5, 4000, 2, "$0,0.00");
      }
    },
    availableColors(tags) {
      const nRequired = tags.integer(0, 3);
      if (!nRequired) return;
      const Colors = ['blue', 'brown', 'green', 'white', 'yellow', 'gray'];
      const nColors = tags.integer(0, Colors.length - 1); // generate a random integer from 0 to 5 will be used to select the total number of colors to add as values
      const aColors = [];
      for (j = 0; j <= nColors && !aColors[j]; j++) {
        let sColor = tags.integer(0, Colors.length - 1); // generate a random integer from 0 to 5 that will be used as index to select a random color from the Colors array
        if (aColors.indexOf(Colors[sColor]) == -1) {
          aColors.push(Colors[sColor]);
        }
      }
      return aColors;
    },
    weight(tags) {
      const nRequired = tags.integer(0, 5);
      if (nRequired) {
        return tags.floating(1, 900, 2, "0.00");
      }
    },
    inStock(tags) {
      const nRequired = tags.integer(0, 2);
      if (nRequired) {
        return tags.integer(0, 2000);
      }
    }
  }
}]


Source: stackoverflow