const should = require('should');
const shared = require('../../../../../../core/server/api/shared');

describe('Unit: v2/utils/serializers/input/all', function () {
    describe('all', function () {
        it('transforms into model readable format', function () {
            const apiConfig = {};
            const frame = {
                original: {
                    include: 'tags',
                    fields: 'id,status',
                    formats: 'html'
                },
                options: {
                    include: 'tags',
                    fields: 'id,status',
                    formats: 'html',
                    context: {}
                }
            };

            shared.serializers.input.all.all(apiConfig, frame);

            should.exist(frame.original.include);
            should.exist(frame.original.fields);
            should.exist(frame.original.formats);

            should.not.exist(frame.options.include);
            should.not.exist(frame.options.fields);
            should.exist(frame.options.formats);
            should.exist(frame.options.columns);
            should.exist(frame.options.withRelated);

            frame.options.withRelated.should.eql(['tags']);
            frame.options.columns.should.eql(['id','status','html']);
            frame.options.formats.should.eql(['html']);
        });

        describe('extra allowed internal options', function () {
            it('internal access', function () {
                const frame = {
                    options: {
                        context: {
                            internal: true
                        },
                        transacting: true,
                        forUpdate: true
                    }
                };

                const apiConfig = {};

                shared.serializers.input.all.all(apiConfig, frame);

                should.exist(frame.options.transacting);
                should.exist(frame.options.forUpdate);
                should.exist(frame.options.context);
            });

            it('no internal access', function () {
                const frame = {
                    options: {
                        context: {
                            user: true
                        },
                        transacting: true,
                        forUpdate: true
                    }
                };

                const apiConfig = {};

                shared.serializers.input.all.all(apiConfig, frame);

                should.not.exist(frame.options.transacting);
                should.not.exist(frame.options.forUpdate);
                should.exist(frame.options.context);
            });
        });
    });
});
