UNPKG

coolprop-node

Version:

A Node.js wrapper for CoolProp providing an easy-to-use interface for thermodynamic calculations and refrigerant properties. Unlike all the other CoolProp npm packages I've seen, this one should actually work. Please report any issues.

296 lines (257 loc) 11 kB
const coolprop = require('../src/index.js'); describe('CoolProp Wrapper', () => { describe('Initialization', () => { it('should fail without refrigerant', async () => { const result = await coolprop.init({}); expect(result.type).toBe('error'); expect(result.message).toContain('Refrigerant must be specified'); }); it('should fail with invalid temperature unit', async () => { const result = await coolprop.init({ refrigerant: 'R404A', tempUnit: 'X' }); expect(result.type).toBe('error'); expect(result.message).toContain('Invalid temperature unit'); }); it('should fail with invalid pressure unit', async () => { const result = await coolprop.init({ refrigerant: 'R404A', pressureUnit: 'X' }); expect(result.type).toBe('error'); expect(result.message).toContain('Invalid pressure unit'); }); it('should succeed with valid config', async () => { const result = await coolprop.init({ refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); console.log(result); expect(result.type).toBe('success'); }); }); describe('Auto-initialization', () => { it('should work without explicit init', async () => { const result = await coolprop.calculateSuperheat({ temperature: 25, pressure: 10, refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); expect(result.type).toBe('success'); expect(result.superheat).toBeDefined(); }); }); describe('Unit Conversions', () => { it('should correctly convert temperature units', async () => { const resultC = await coolprop.getSaturationTemperature({ pressure: 10, refrigerant: 'R404A', pressureUnit: 'bar', tempUnit: 'C' }); const resultF = await coolprop.getSaturationTemperature({ pressure: 10, refrigerant: 'R404A', pressureUnit: 'bar', tempUnit: 'F' }); const resultK = await coolprop.getSaturationTemperature({ pressure: 10, refrigerant: 'R404A', pressureUnit: 'bar', tempUnit: 'K' }); expect(Math.abs((resultC.temperature * 9/5 + 32) - resultF.temperature)).toBeLessThan(0.01); expect(Math.abs((resultC.temperature + 273.15) - resultK.temperature)).toBeLessThan(0.01); }); it('should correctly convert pressure units', async () => { const resultBar = await coolprop.getSaturationPressure({ temperature: 25, refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); const resultPsi = await coolprop.getSaturationPressure({ temperature: 25, refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'psi' }); expect(Math.abs((resultBar.pressure * 14.5038) - resultPsi.pressure)).toBeLessThan(0.1); }); }); describe('Refrigerant Calculations', () => { const refrigerants = ['R404A', 'R134a', 'R507A', 'R744']; refrigerants.forEach(refrigerant => { describe(refrigerant, () => { it('should calculate superheat', async () => { const result = await coolprop.calculateSuperheat({ temperature: 25, pressure: 10, refrigerant, tempUnit: 'C', pressureUnit: 'bar' }); expect(result.type).toBe('success'); expect(result.superheat).toBeDefined(); expect(result.refrigerant).toBe(refrigerant); expect(result.units).toEqual(expect.objectContaining({ temperature: 'C', pressure: 'bar' })); }); it('should calculate subcooling', async () => { const result = await coolprop.calculateSubcooling({ temperature: 20, pressure: 20, refrigerant, tempUnit: 'C', pressureUnit: 'bar' }); expect(result.type).toBe('success'); expect(result.subcooling).toBeDefined(); expect(result.refrigerant).toBe(refrigerant); }); it('should get all properties', async () => { const result = await coolprop.getProperties({ temperature: 25, pressure: 10, refrigerant, tempUnit: 'C', pressureUnit: 'bar' }); expect(result.type).toBe('success'); expect(result.properties).toBeDefined(); expect(result.refrigerant).toBe(refrigerant); // Check all required properties exist const requiredProps = [ 'temperature', 'pressure', 'density', 'enthalpy', 'entropy', 'quality', 'conductivity', 'viscosity', 'specificHeat' ]; requiredProps.forEach(prop => { expect(result.properties[prop]).toBeDefined(); expect(typeof result.properties[prop]).toBe('number'); }); }); }); }); }); describe('Default Override Behavior', () => { beforeAll(async () => { await coolprop.init({ refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); }); it('should use defaults when no overrides provided', async () => { const result = await coolprop.calculateSuperheat({ temperature: 25, pressure: 10 }); expect(result.refrigerant).toBe('R404A'); expect(result.units.temperature).toBe('C'); expect(result.units.pressure).toBe('bar'); }); it('should allow refrigerant override', async () => { const result = await coolprop.calculateSuperheat({ temperature: 25, pressure: 10, refrigerant: 'R134a' }); expect(result.refrigerant).toBe('R134a'); }); it('should allow unit overrides', async () => { const result = await coolprop.calculateSuperheat({ temperature: 77, pressure: 145, tempUnit: 'F', pressureUnit: 'psi' }); expect(result.units.temperature).toBe('F'); expect(result.units.pressure).toBe('psi'); }); }); describe('Default Settings Management', () => { it('should allow updating defaults after initialization', async () => { // Initial setup await coolprop.init({ refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); // Update defaults const updateResult = await coolprop.init({ refrigerant: 'R134a', tempUnit: 'F', pressureUnit: 'psi' }); expect(updateResult.type).toBe('success'); expect(updateResult.message).toBe('Default settings updated'); // Verify new defaults are used const result = await coolprop.calculateSuperheat({ temperature: 77, pressure: 145 }); expect(result.refrigerant).toBe('R134a'); expect(result.units.temperature).toBe('F'); expect(result.units.pressure).toBe('psi'); }); it('should update the coolprop instance if refrigerant is changed', async () => { // Set initial defaults await coolprop.init({ refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); const config = await coolprop.getConfig(); // First call with overrides const result1 = await coolprop.calculateSuperheat({ temperature: 25, pressure: 10, refrigerant: 'R507A', tempUnit: 'C', pressureUnit: 'bar' }); // Second call using defaults const result2 = await coolprop.calculateSuperheat({ temperature: 25, pressure: 10 }); const config2 = await coolprop.getConfig(); expect(config.refrigerant).toBe('R404A'); expect(config2.refrigerant).toBe('R507A'); expect(result1.refrigerant).toBe('R507A'); expect(result2.refrigerant).toBe('R507A'); }); it('should allow partial updates of defaults', async () => { // Initial setup await coolprop.init({ refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); // Update only temperature unit await coolprop.init({ tempUnit: 'F' }); const result = await coolprop.calculateSuperheat({ temperature: 77, pressure: 10 }); expect(result.refrigerant).toBe('R404A'); // unchanged expect(result.units.temperature).toBe('F'); // updated expect(result.units.pressure).toBe('bar'); // unchanged }); it('should validate units when updating defaults', async () => { await coolprop.init({ refrigerant: 'R404A', tempUnit: 'C', pressureUnit: 'bar' }); const result = await coolprop.init({ tempUnit: 'X' // invalid unit }); expect(result.type).toBe('error'); expect(result.message).toContain('Invalid temperature unit'); }); }); });