dolibarr/test/phpunit/SocieteTest.php

543 lines
16 KiB
PHP
Raw Normal View History

2010-10-13 21:01:22 +02:00
<?php
/* Copyright (C) 2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2023 Alexandre Janniaux <alexandre.janniaux@gmail.com>
2010-10-13 21:01:22 +02:00
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
2010-10-13 21:01:22 +02:00
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program. If not, see <https://www.gnu.org/licenses/>.
* or see https://www.gnu.org/
2010-10-13 21:01:22 +02:00
*/
/**
* \file test/phpunit/SocieteTest.php
2015-01-06 17:54:36 +01:00
* \ingroup test
2010-10-13 21:01:22 +02:00
* \brief PHPUnit test
2015-01-06 17:54:36 +01:00
* \remarks To run this script as CLI: phpunit filename.php
2010-10-13 21:01:22 +02:00
*/
global $conf,$user,$langs,$db;
2015-01-06 17:54:36 +01:00
//define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver
//require_once 'PHPUnit/Autoload.php';
2010-10-13 21:01:22 +02:00
require_once dirname(__FILE__).'/../../htdocs/master.inc.php';
require_once dirname(__FILE__).'/../../htdocs/societe/class/societe.class.php';
2011-12-30 14:18:19 +01:00
$langs->load("dict");
2010-10-13 21:01:22 +02:00
2015-01-06 17:54:36 +01:00
if (empty($user->id)) {
2021-01-14 15:09:08 +01:00
print "Load permissions for admin user nb 1\n";
$user->fetch(1);
$user->getrights();
2010-10-13 21:01:22 +02:00
}
$conf->global->MAIN_DISABLE_ALL_MAILS=1;
/**
2011-09-23 14:21:00 +02:00
* Class for PHPUnit tests
*
2010-10-13 21:01:22 +02:00
* @backupGlobals disabled
* @backupStaticAttributes enabled
* @remarks backupGlobals must be disabled to have db,conf,user and lang not erased.
*/
2019-07-05 21:28:27 +02:00
class SocieteTest extends PHPUnit\Framework\TestCase
2010-10-13 21:01:22 +02:00
{
2021-01-14 15:09:08 +01:00
protected $savconf;
protected $savuser;
protected $savlangs;
protected $savdb;
/**
* Constructor
* We save global variables into local variables
*
* @param string $name Name
2021-01-14 15:09:08 +01:00
* @return SocieteTest
*/
public function __construct($name = '')
2021-01-14 15:09:08 +01:00
{
parent::__construct($name);
2021-01-14 15:09:08 +01:00
//$this->sharedFixture
global $conf,$user,$langs,$db;
$this->savconf=$conf;
$this->savuser=$user;
$this->savlangs=$langs;
$this->savdb=$db;
print __METHOD__." db->type=".$db->type." user->id=".$user->id;
//print " - db ".$db->db;
print "\n";
}
/**
* setUpBeforeClass
*
* @return void
*/
2022-09-21 17:55:04 +02:00
public static function setUpBeforeClass(): void
2021-01-14 15:09:08 +01:00
{
global $conf,$user,$langs,$db;
if ($conf->global->SOCIETE_CODECLIENT_ADDON != 'mod_codeclient_monkey') {
2023-12-04 11:22:28 +01:00
print "\n".__METHOD__." third party ref checker must be setup to 'mod_codeclient_monkey' not to '" . getDolGlobalString('SOCIETE_CODECLIENT_ADDON')."'.\n";
die(1);
2021-01-14 15:09:08 +01:00
}
2023-11-27 13:26:44 +01:00
if (getDolGlobalString('MAIN_DISABLEPROFIDRULES')) {
2023-12-04 11:22:28 +01:00
print "\n".__METHOD__." constant MAIN_DISABLEPROFIDRULES must be empty (if a module set it, disable module).\n";
die(1);
2021-01-14 15:09:08 +01:00
}
2021-03-02 23:48:33 +01:00
if ($langs->defaultlang != 'en_US') {
2023-12-04 11:22:28 +01:00
print "\n".__METHOD__." default language of company must be set to autodetect.\n";
die(1);
2021-03-02 23:48:33 +01:00
}
2021-01-14 15:09:08 +01:00
$db->begin(); // This is to have all actions inside a transaction even if test launched without suite.
print __METHOD__."\n";
}
/**
* tearDownAfterClass
*
* @return void
*/
2022-09-21 17:55:04 +02:00
public static function tearDownAfterClass(): void
2021-01-14 15:09:08 +01:00
{
global $conf,$user,$langs,$db;
$db->rollback();
print __METHOD__."\n";
}
/**
* Init phpunit tests
*
* @return void
*/
2022-09-21 17:55:04 +02:00
protected function setUp(): void
2021-01-14 15:09:08 +01:00
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
print __METHOD__."\n";
}
/**
* End phpunit tests
*
* @return void
*/
2022-09-21 17:55:04 +02:00
protected function tearDown(): void
2021-01-14 15:09:08 +01:00
{
print __METHOD__."\n";
}
/**
* testSocieteCreate
*
* @return int
*/
public function testSocieteCreate()
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
$localobject=new Societe($db);
2021-01-14 15:09:08 +01:00
$localobject->initAsSpecimen();
$result=$localobject->create($user);
print __METHOD__." result=".$result."\n";
$this->assertLessThanOrEqual($result, 0);
return $result;
}
/**
* testSocieteFetch
*
* @param int $id Company id
* @return Societe $localobject Company
*
* @depends testSocieteCreate
* The depends says test is run only if previous is ok
*/
public function testSocieteFetch($id)
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
$localobject=new Societe($db);
2021-01-14 15:09:08 +01:00
$result=$localobject->fetch($id);
print __METHOD__." id=".$id." result=".$result."\n";
$this->assertLessThan($result, 0);
$result=$localobject->verify();
print __METHOD__." id=".$id." result=".$result."\n";
$this->assertEquals($result, 0);
return $localobject;
}
/**
* testSocieteUpdate
*
* @param Societe $localobject Company
* @return Societe $localobject Company
*
* @depends testSocieteFetch
* The depends says test is run only if previous is ok
*/
public function testSocieteUpdate($localobject)
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
$localobject->note_private='New private note after update';
$localobject->note_public='New public note after update';
$localobject->name='New name';
$localobject->address='New address';
$localobject->zip='New zip';
$localobject->town='New town';
$localobject->country_id=2;
$localobject->status=0;
$localobject->phone='New tel';
$localobject->fax='New fax';
$localobject->email='newemail@newemail.com';
$localobject->url='New url';
$localobject->idprof1='new idprof1';
$localobject->idprof2='new idprof2';
$localobject->idprof3='new idprof3';
$localobject->idprof4='new idprof4';
$result=$localobject->update($localobject->id, $user);
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertLessThan($result, 0);
2015-01-06 17:54:36 +01:00
2019-01-27 13:07:22 +01:00
$result=$localobject->update_note($localobject->note_private, '_private');
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertLessThan($result, 0, 'Holiday::update_note (private) error');
2015-01-06 17:54:36 +01:00
$result=$localobject->update_note($localobject->note_public, '_public');
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertLessThan($result, 0, 'Holiday::update_note (public) error');
2015-01-06 17:54:36 +01:00
$newobject=new Societe($db);
2021-01-14 15:09:08 +01:00
$result=$newobject->fetch($localobject->id);
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertLessThan($result, 0);
$this->assertEquals($localobject->note_private, $newobject->note_private);
//$this->assertEquals($localobject->note_public, $newobject->note_public);
$this->assertEquals($localobject->name, $newobject->name);
$this->assertEquals($localobject->address, $newobject->address);
$this->assertEquals($localobject->zip, $newobject->zip);
$this->assertEquals($localobject->town, $newobject->town);
$this->assertEquals($localobject->country_id, $newobject->country_id);
$this->assertEquals('BE', $newobject->country_code);
$this->assertEquals($localobject->status, $newobject->status);
$this->assertEquals($localobject->phone, $newobject->phone);
$this->assertEquals($localobject->fax, $newobject->fax);
$this->assertEquals($localobject->email, $newobject->email);
$this->assertEquals($localobject->url, $newobject->url);
$this->assertEquals($localobject->idprof1, $newobject->idprof1);
$this->assertEquals($localobject->idprof2, $newobject->idprof2);
$this->assertEquals($localobject->idprof3, $newobject->idprof3);
$this->assertEquals($localobject->idprof4, $newobject->idprof4);
return $localobject;
}
/**
* testIdProfCheck
*
* @param Societe $localobject Company
* @return Societe $localobject Company
*
* @depends testSocieteUpdate
* The depends says test is run only if previous is ok
*/
public function testIdProfCheck($localobject)
{
// OK FR
$localobject->country_code='FR';
$localobject->idprof1=493861496;
$localobject->idprof2=49386149600021;
$result=$localobject->id_prof_check(1, $localobject); // Must be > 0
print __METHOD__." OK FR idprof1 result=".$result."\n";
$this->assertGreaterThanOrEqual(1, $result);
$result=$localobject->id_prof_check(2, $localobject); // Must be > 0
print __METHOD__." OK FR idprof2 result=".$result."\n";
$this->assertGreaterThanOrEqual(1, $result);
// KO FR
$localobject->country_code='FR';
$localobject->idprof1='id1ko';
$localobject->idprof2='id2ko';
$result=$localobject->id_prof_check(1, $localobject); // Must be <= 0
print __METHOD__." KO FR idprof1 result=".$result."\n";
$this->assertLessThan(1, $result);
$result=$localobject->id_prof_check(2, $localobject); // Must be <= 0
print __METHOD__." KO FR idprof2 result=".$result."\n";
$this->assertLessThan(1, $result);
// KO ES
$localobject->country_code='ES';
$localobject->idprof1='id1ko';
$result=$localobject->id_prof_check(1, $localobject); // Must be <= 0
print __METHOD__." KO ES idprof1 result=".$result."\n";
$this->assertLessThan(1, $result);
// OK AR
$localobject->country_code='AR';
$localobject->idprof1='id1ko';
$localobject->idprof2='id2ko';
$result=$localobject->id_prof_check(1, $localobject); // Must be > 0
print __METHOD__." OK AR idprof1 result=".$result."\n";
$this->assertGreaterThanOrEqual(0, $result);
$result=$localobject->id_prof_check(2, $localobject); // Must be > 0
print __METHOD__." OK AR idprof2 result=".$result."\n";
$this->assertGreaterThanOrEqual(1, $result);
return $localobject;
}
/**
* testSocieteOther
*
* @param Societe $localobject Company
* @return int $id Id of company
*
* @depends testIdProfCheck
* The depends says test is run only if previous is ok
*/
public function testSocieteOther($localobject)
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
2023-09-06 13:58:08 +02:00
$result=$localobject->setAsCustomer();
2021-01-14 15:09:08 +01:00
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertLessThan($result, 0);
2021-04-01 12:29:56 +02:00
$result=$localobject->setPriceLevel(1, $user);
2021-01-14 15:09:08 +01:00
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertLessThan($result, 0);
$result=$localobject->set_remise_client(10, 'Gift', $user);
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertLessThan($result, 0);
$result=$localobject->getNomUrl(1);
print __METHOD__." id=".$localobject->id." result=".$result."\n";
$this->assertNotEquals($result, '');
2021-03-02 23:48:33 +01:00
$localobject->country_code = 'FR';
2021-01-14 15:09:08 +01:00
$result=$localobject->isInEEC();
print __METHOD__." id=".$localobject->id." country_code=".$localobject->country_code." result=".$result."\n";
2021-03-02 23:55:41 +01:00
$this->assertTrue($result);
$localobject->country_code = 'US';
$result=$localobject->isInEEC();
print __METHOD__." id=".$localobject->id." country_code=".$localobject->country_code." result=".$result."\n";
$this->assertFalse($result);
/*$localobject->country_code = 'GB';
$result=$localobject->isInEEC();
print __METHOD__." id=".$localobject->id." country_code=".$localobject->country_code." result=".$result."\n";
$this->assertTrue($result);
*/
2021-01-14 15:09:08 +01:00
$localobject->info($localobject->id);
print __METHOD__." localobject->date_creation=".$localobject->date_creation."\n";
$this->assertNotEquals($localobject->date_creation, '');
return $localobject->id;
}
/**
2021-05-04 15:53:15 +02:00
* testGetOutstandingBills
2021-01-14 15:09:08 +01:00
*
* @param int $id Id of company
* @return int
*
* @depends testSocieteOther
* The depends says test is run only if previous is ok
*/
2021-05-04 15:46:38 +02:00
public function testGetOutstandingBills($id)
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
$localobject=new Societe($db);
2021-05-04 15:46:38 +02:00
$localobject->fetch($id);
$result=$localobject->getOutstandingBills();
print __METHOD__." id=".$id." result=".var_export($result, true)."\n";
2021-05-04 15:52:38 +02:00
$this->assertTrue(array_key_exists('opened', $result), 'Result of getOutstandingBills failed');
2021-05-04 15:46:38 +02:00
return $id;
}
/**
* testSocieteDelete
*
* @param int $id Id of company
* @return int
*
* @depends testGetOutstandingBills
* The depends says test is run only if previous is ok
*/
2021-01-14 15:09:08 +01:00
public function testSocieteDelete($id)
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
$localobject=new Societe($db);
2021-01-14 15:09:08 +01:00
$result=$localobject->fetch($id);
$result=$localobject->delete($id, $user);
print __METHOD__." id=".$id." result=".$result."\n";
$this->assertLessThan($result, 0);
return $result;
}
/**
* testSocieteGetFullAddress
*
* @return int $id Id of company
*/
public function testSocieteGetFullAddress()
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
$localobjectadd=new Societe($db);
$localobjectadd->initAsSpecimen();
// France
unset($localobjectadd->country_code);
$localobjectadd->country_id=1;
$localobjectadd->name='New name';
$localobjectadd->address='New address';
$localobjectadd->zip='New zip';
$localobjectadd->town='New town';
$result=$localobjectadd->getFullAddress(1);
print __METHOD__." id=".$localobjectadd->id." result=".$result."\n";
2023-09-10 19:41:14 +02:00
$this->assertStringContainsString("New address\nNew zip New town\nFrance", $result);
2021-01-14 15:09:08 +01:00
// Belgium
unset($localobjectadd->country_code);
$localobjectadd->country_id=2;
$localobjectadd->name='New name';
$localobjectadd->address='New address';
$localobjectadd->zip='New zip';
$localobjectadd->town='New town';
$result=$localobjectadd->getFullAddress(1);
print __METHOD__." id=".$localobjectadd->id." result=".$result."\n";
2023-09-10 19:41:14 +02:00
$this->assertStringContainsString("New address\nNew zip New town\nBelgium", $result);
2021-01-14 15:09:08 +01:00
// Switzerland
unset($localobjectadd->country_code);
$localobjectadd->country_id=6;
$localobjectadd->name='New name';
$localobjectadd->address='New address';
$localobjectadd->zip='New zip';
$localobjectadd->town='New town';
$result=$localobjectadd->getFullAddress(1);
print __METHOD__." id=".$localobjectadd->id." result=".$result."\n";
2023-09-10 19:41:14 +02:00
$this->assertStringContainsString("New address\nNew zip New town\nSwitzerland", $result);
2021-01-14 15:09:08 +01:00
// USA
unset($localobjectadd->country_code);
$localobjectadd->country_id=11;
$localobjectadd->name='New name';
$localobjectadd->address='New address';
$localobjectadd->zip='New zip';
$localobjectadd->town='New town';
$localobjectadd->state='New state';
$result=$localobjectadd->getFullAddress(1);
print __METHOD__." id=".$localobjectadd->id." result=".$result."\n";
2023-09-10 19:41:14 +02:00
$this->assertStringContainsString("New address\nNew town, New state, New zip\nUnited States", $result);
2021-01-14 15:09:08 +01:00
return $localobjectadd->id;
}
QUAL Refactor merging companies and fix #26272 with Reception objects (#26320) * societe: add missing model_pdf field The field is used by the class but wasn't declared. * societe: expose Societe::mergeCompany The code is directly copied from societe/card.php with as less changes as possible. The original code came from deb91ad7c17490934c988b36823a21ba03354733. * societe: remove fields from property copy $phone_pro and $fk_project are not existing for societe. This was added from deb91ad7c17490934c988b36823a21ba03354733. * SocieteTest: test the merge functionality This test is a simple smoke test to check that the mergeCompany() will work correctly on simple case and actually merge the details of the company. More complex deduplication pattern with objects referencing the deleted Societe object, will be written for each of the different object class in their respective test file. * societe: card: use the new mergeCompany function Since the code is almost the same, there should be no differences in behaviour right now. * societe: api_thirdparties: use Societe::mergeCompany() * societe: fix issue when merging companies When a Societe object is merged against another, its related objects are supposed to reference the new Societe object so that the databse doesn't raise foreign key errors. The list references the objects that need to be transformed, and Reception objects weren't part of this list. Fix #26272 * ReceptionTest: check company merge hook Before a Societe object is destroyed from the database, every object referencing the FK should be destroyed or should reference another object. In the case of two companies being merged, the case arises and Reception objects need to be moved to the new company. This commit brings a non-regression test for this case. Refs #26272 * Update societe.class.php --------- Co-authored-by: Laurent Destailleur <eldy@destailleur.fr>
2023-10-26 16:30:38 +02:00
/**
* testSocieteMerge
*
* Check that we can merge two companies together. In this test,
* no other object is referencing the companies.
*
* @return int the result of the merge and fetch operation
*/
public function testSocieteMerge()
{
global $user, $db;
$soc1 = new Societe($db);
$soc1->initAsSpecimen();
$soc1_id = $soc1->create($user);
$this->assertLessThanOrEqual($soc1_id, 0);
$soc2 = new Societe($db);
$soc2->entity = 1;
$soc2->name = "Copy of ".$soc1->name;
$soc2->code_client = 'CC-0002';
$soc2->code_fournisseur = 'SC-0002';
$soc2_id = $soc2->create($user);
$this->assertLessThanOrEqual($soc2_id, 0, implode('\n', $soc2->errors));
$result = $soc1->mergeCompany($soc2_id);
$this->assertLessThanOrEqual($result, 0, implode('\n', $soc1->errors));
$result = $soc1->fetch($soc1_id);
$this->assertLessThanOrEqual($result, 0);
print __METHOD__." result=".$result."\n";
return $result;
}
2010-10-13 21:01:22 +02:00
}