Search code examples
javascriptjasmineprotractordataprovider

Assigning value to jasmine-data-provider from nested json?


I have the following sample.json file. Examples found on the jasmine-data-provider were illustrated for simple JSON data. How do I pass the values of the below json data to the data-provider.

     [
  {
        "company_name": "Google",
        "Headquartered_at": "Mountain view",
        "Department": [
          {
            "name": "Engineering",
            "number_of_subDepartment": "3",
            "subDepartments": [
              {
                    "subDepartment_name": "Developers",
                    "no_of_employees": "10"
                },
                {
                    "subDepartment_name": "SRE",
                    "no_of_employees": "10"
                },
                {
                    "subDepartment_name": "QA",
                    "no_of_employees": "10"
                }
            ]
        }, {
            "name": "Human resources",
            "number_of_subDepartment": "0"
        }]
    },
  {
        "company_name": "Microsoft",
        "Headquartered_at": "Redmond",
        "Department": [
          {
            "name": "Engineering",
            "number_of_subDepartment": "2",
            "subDepartments": [
              {
                    "subDepartment_name": "Developers",
                    "no_of_employees": "10"
                },
                {
                    "subDepartment_name": "QA",
                    "no_of_employees": "10"
                }
            ]
        }, 
          {
            "name": "Human resources",
            "number_of_subDepartment": "0"
        }]

    },
  {
        "company_name": "Facebook",
        "Headquartered_at": "Menlo park",
        "Department": [
          {
            "name": "Engineering",
            "number_of_subDepartment": "2",
            "subDepartments": [
              {
                    "subDepartment_name": "Developers",
                    "no_of_employees": "10"
                },
                {
                    "subDepartment_name": "QA",
                    "no_of_employees": "10"
                }
            ]
        }, 
          {
            "name": "Human resources",
            "number_of_subDepartment": "0"
        }]
    }


]

The examples of usage in spec files were like below

describe('test addition with data provider - provider function', function () {
    function plusProvider() {
        return [
            {a: 2, b: 3, expected: 5},
            {a: '14', b: 15, expected: 29},
            {a: 12, b: '13', expected: 25},
            {a: '22', b: '13', expected: 35},
        ];
    }

    using(plusProvider, function (data) {
        it('should calc with operator +', function () {
            var result = calculator.calc(data.a, data.b, '+');

            expect(result).toEqual(data.expected);
        });
    });
});

As the sample.json file is more complex, how do I read and assign values to the data-provider function. Could you point me to the right resources.


Solution

  • It should be possible to interact with the passed JSON in any manner you require using the standard JSON notation with jasmine-data-provider. Or are you wanting to call it on each JSON block inside you array?

    datafile.json

    [
        {
            "company_name": "Google",
            "Headquartered_at": "Mountain view",
            "Department": [
                {
                    "name": "Engineering",
                    "number_of_subDepartment": "3",
                    "subDepartments": [
                        {
                            "subDepartment_name": "Developers",
                            "no_of_employees": "10"
                        },
                        {
                            "subDepartment_name": "SRE",
                            "no_of_employees": "10"
                        },
                        {
                            "subDepartment_name": "QA",
                            "no_of_employees": "10"
                        }
                    ]
                },
                {
                    "name": "Human resources",
                    "number_of_subDepartment": "0"
                }
            ]
        },
        {
            "company_name": "Microsoft",
            "Headquartered_at": "Redmond",
            "Department": [
                {
                    "name": "Engineering",
                    "number_of_subDepartment": "2",
                    "subDepartments": [
                        {
                            "subDepartment_name": "Developers",
                            "no_of_employees": "10"
                        },
                        {
                            "subDepartment_name": "QA",
                            "no_of_employees": "10"
                        }
                    ]
                },
                {
                    "name": "Human resources",
                    "number_of_subDepartment": "0"
                }
            ]
        },
        {
            "company_name": "Facebook",
            "Headquartered_at": "Menlo park",
            "Department": [
                {
                    "name": "Engineering",
                    "number_of_subDepartment": "2",
                    "subDepartments": [
                        {
                            "subDepartment_name": "Developers",
                            "no_of_employees": "10"
                        },
                        {
                            "subDepartment_name": "QA",
                            "no_of_employees": "10"
                        }
                    ]
                },
                {
                    "name": "Human resources",
                    "number_of_subDepartment": "0"
                }
            ]
        }
    ]
    

    code

    let using = require('jasmine-data-provider');
    let file = require('./datafile.json');
    using(file, (companyData) => {
        console.log(companyData.company_name);
        console.log(companyData.Headquartered_at);
        for (let department of companyData.Department) {
            console.log('Department name=' + department.name);
            console.log('num sub departments=' + department.number_of_subDepartment);
            if (department.number_of_subDepartment > 0) {
                for (let subDepartment of department.subDepartments) {
                    console.log(subDepartment);
                }
            }
        }
        console.log();
    
        //alternatively you can access in the standard way
        console.log(companyData.Department[0].name);
        console.log();
    })