mirror of
https://github.com/opensupports/opensupports.git
synced 2025-07-31 01:35:15 +02:00
Merged in captcha (pull request #39)
Funcionalidad de Captcha [Frontend/Backend]
This commit is contained in:
commit
62cb8df2b6
@ -65,7 +65,7 @@
|
|||||||
"react": "^15.0.1",
|
"react": "^15.0.1",
|
||||||
"react-document-title": "^1.0.2",
|
"react-document-title": "^1.0.2",
|
||||||
"react-dom": "^15.0.1",
|
"react-dom": "^15.0.1",
|
||||||
"react-google-recaptcha": "^0.5.2",
|
"react-google-recaptcha": "^0.5.4",
|
||||||
"react-motion": "^0.3.0",
|
"react-motion": "^0.3.0",
|
||||||
"react-redux": "^4.4.5",
|
"react-redux": "^4.4.5",
|
||||||
"react-router": "^2.4.0",
|
"react-router": "^2.4.0",
|
||||||
|
@ -11,8 +11,8 @@ const ConfigActions = requireUnit('actions/config-actions', {
|
|||||||
describe('Config Actions,', function () {
|
describe('Config Actions,', function () {
|
||||||
|
|
||||||
describe('init action', function () {
|
describe('init action', function () {
|
||||||
it('should return INIT_CONFIGS_FULFILLED with configs if it is already retrieved', function () {
|
it('should return INIT_CONFIGS_FULFILLED with configs if it user is logged in', function () {
|
||||||
sessionStoreMock.areConfigsStored.returns(true);
|
sessionStoreMock.isLoggedIn.returns(true);
|
||||||
sessionStoreMock.getConfigs.returns({
|
sessionStoreMock.getConfigs.returns({
|
||||||
config1: 'CONFIG_1',
|
config1: 'CONFIG_1',
|
||||||
config2: 'CONFIG_2'
|
config2: 'CONFIG_2'
|
||||||
@ -31,7 +31,7 @@ describe('Config Actions,', function () {
|
|||||||
|
|
||||||
it('should return INIT_CONFIGS with API_RESULT if it is not retrieved', function () {
|
it('should return INIT_CONFIGS with API_RESULT if it is not retrieved', function () {
|
||||||
APICallMock.call.reset();
|
APICallMock.call.reset();
|
||||||
sessionStoreMock.areConfigsStored.returns(false);
|
sessionStoreMock.isLoggedIn.returns(false);
|
||||||
sessionStoreMock.getConfigs.returns({
|
sessionStoreMock.getConfigs.returns({
|
||||||
config1: 'CONFIG_1',
|
config1: 'CONFIG_1',
|
||||||
config2: 'CONFIG_2'
|
config2: 'CONFIG_2'
|
||||||
@ -42,7 +42,7 @@ describe('Config Actions,', function () {
|
|||||||
payload: 'API_RESULT'
|
payload: 'API_RESULT'
|
||||||
});
|
});
|
||||||
expect(APICallMock.call).to.have.been.calledWith({
|
expect(APICallMock.call).to.have.been.calledWith({
|
||||||
path: '/system/get-configs',
|
path: '/system/get-settings',
|
||||||
data: {}
|
data: {}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -3,7 +3,7 @@ import sessionStore from 'lib-app/session-store';
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
init() {
|
init() {
|
||||||
if (sessionStore.areConfigsStored()) {
|
if (sessionStore.isLoggedIn()) {
|
||||||
return {
|
return {
|
||||||
type: 'INIT_CONFIGS_FULFILLED',
|
type: 'INIT_CONFIGS_FULFILLED',
|
||||||
payload: {
|
payload: {
|
||||||
@ -14,7 +14,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
type: 'INIT_CONFIGS',
|
type: 'INIT_CONFIGS',
|
||||||
payload: API.call({
|
payload: API.call({
|
||||||
path: '/system/get-configs',
|
path: '/system/get-settings',
|
||||||
data: {}
|
data: {}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
@ -2,6 +2,8 @@ import API from 'lib-app/api-call';
|
|||||||
import sessionStore from 'lib-app/session-store';
|
import sessionStore from 'lib-app/session-store';
|
||||||
import store from 'app/store';
|
import store from 'app/store';
|
||||||
|
|
||||||
|
import ConfigActions from 'actions/config-actions';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
login(loginData) {
|
login(loginData) {
|
||||||
return {
|
return {
|
||||||
|
35
client/src/app/main/captcha.js
Normal file
35
client/src/app/main/captcha.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import ReCAPTCHA from 'react-google-recaptcha';
|
||||||
|
import {connect} from 'react-redux';
|
||||||
|
|
||||||
|
|
||||||
|
class Captcha extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
value: ''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<ReCAPTCHA sitekey={this.props.sitekey} ref="reCaptcha" onChange={(value) => {this.setState({value})}} tabIndex="0" />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
getValue() {
|
||||||
|
return this.state.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
ReactDOM.findDOMNode(this).focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect((store) => {
|
||||||
|
return {
|
||||||
|
sitekey: store.config.reCaptchaKey
|
||||||
|
};
|
||||||
|
}, null, null, { withRef: true })(Captcha);
|
@ -4,6 +4,7 @@ import { browserHistory } from 'react-router';
|
|||||||
|
|
||||||
import i18n from 'lib-app/i18n';
|
import i18n from 'lib-app/i18n';
|
||||||
import API from 'lib-app/api-call';
|
import API from 'lib-app/api-call';
|
||||||
|
import SessionStore from 'lib-app/session-store';
|
||||||
import store from 'app/store';
|
import store from 'app/store';
|
||||||
import SessionActions from 'actions/session-actions';
|
import SessionActions from 'actions/session-actions';
|
||||||
|
|
||||||
@ -41,11 +42,7 @@ class CreateTicketForm extends React.Component {
|
|||||||
<div className="row">
|
<div className="row">
|
||||||
<FormField className="col-md-7" label="Title" name="title" validation="TITLE" required field="input" fieldProps={{size: 'large'}}/>
|
<FormField className="col-md-7" label="Title" name="title" validation="TITLE" required field="input" fieldProps={{size: 'large'}}/>
|
||||||
<FormField className="col-md-5" label="Department" name="departmentId" field="select" fieldProps={{
|
<FormField className="col-md-5" label="Department" name="departmentId" field="select" fieldProps={{
|
||||||
items: [
|
items: SessionStore.getDepartments().map((department) => {return {content: department}}),
|
||||||
{content: 'Sales Support'},
|
|
||||||
{content: 'Technical Issues'},
|
|
||||||
{content: 'System and Administration'}
|
|
||||||
],
|
|
||||||
size: 'medium'
|
size: 'medium'
|
||||||
}} />
|
}} />
|
||||||
</div>
|
</div>
|
||||||
@ -70,7 +67,7 @@ class CreateTicketForm extends React.Component {
|
|||||||
renderCaptcha() {
|
renderCaptcha() {
|
||||||
return (
|
return (
|
||||||
<div className="create-ticket-form__captcha">
|
<div className="create-ticket-form__captcha">
|
||||||
<ReCAPTCHA sitekey="6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS" onChange={function () {}}/>
|
<Captcha />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReCAPTCHA from 'react-google-recaptcha';
|
import ReactDOM from 'react-dom';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
import i18n from 'lib-app/i18n';
|
import i18n from 'lib-app/i18n';
|
||||||
import API from 'lib-app/api-call';
|
import API from 'lib-app/api-call';
|
||||||
|
|
||||||
|
import Captcha from 'app/main/captcha';
|
||||||
import SubmitButton from 'core-components/submit-button';
|
import SubmitButton from 'core-components/submit-button';
|
||||||
import Message from 'core-components/message';
|
import Message from 'core-components/message';
|
||||||
import Form from 'core-components/form';
|
import Form from 'core-components/form';
|
||||||
@ -34,7 +36,7 @@ class MainSignUpPageWidget extends React.Component {
|
|||||||
<FormField {...this.getInputProps(true)} label="Repeat Password" name="repeated-password" validation="REPEAT_PASSWORD" required/>
|
<FormField {...this.getInputProps(true)} label="Repeat Password" name="repeated-password" validation="REPEAT_PASSWORD" required/>
|
||||||
</div>
|
</div>
|
||||||
<div className="signup-widget__captcha">
|
<div className="signup-widget__captcha">
|
||||||
<ReCAPTCHA sitekey="6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS" onChange={function () {}}/>
|
<Captcha ref="captcha"/>
|
||||||
</div>
|
</div>
|
||||||
<SubmitButton type="primary">SIGN UP</SubmitButton>
|
<SubmitButton type="primary">SIGN UP</SubmitButton>
|
||||||
</Form>
|
</Form>
|
||||||
@ -75,14 +77,20 @@ class MainSignUpPageWidget extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onLoginFormSubmit(formState) {
|
onLoginFormSubmit(formState) {
|
||||||
this.setState({
|
const captcha = this.refs.captcha.getWrappedInstance();
|
||||||
loading: true
|
|
||||||
});
|
|
||||||
|
|
||||||
API.call({
|
if (!captcha.getValue()) {
|
||||||
path: '/user/signup',
|
captcha.focus();
|
||||||
data: formState
|
} else {
|
||||||
}).then(this.onSignupSuccess.bind(this)).catch(this.onSignupFail.bind(this));
|
this.setState({
|
||||||
|
loading: true
|
||||||
|
});
|
||||||
|
|
||||||
|
API.call({
|
||||||
|
path: '/user/signup',
|
||||||
|
data: _.extend({captcha: captcha.getValue()}, formState)
|
||||||
|
}).then(this.onSignupSuccess.bind(this)).catch(this.onSignupFail.bind(this));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onSignupSuccess() {
|
onSignupSuccess() {
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
module.exports = [
|
module.exports = [
|
||||||
{
|
{
|
||||||
path: '/system/get-configs',
|
path: '/system/get-settings',
|
||||||
time: 1000,
|
time: 1000,
|
||||||
response: function () {
|
response: function () {
|
||||||
return {
|
return {
|
||||||
status: 'success',
|
status: 'success',
|
||||||
data: {
|
data: {
|
||||||
'language': 'us',
|
'language': 'us',
|
||||||
'reCaptchaKey': '6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS'
|
'reCaptchaKey': '6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS',
|
||||||
|
'departments': [
|
||||||
|
'Sales Support',
|
||||||
|
'Technical Issues',
|
||||||
|
'System and Administration'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,10 @@ class SessionStore {
|
|||||||
return JSON.parse(this.getItem('userData'));
|
return JSON.parse(this.getItem('userData'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getDepartments() {
|
||||||
|
return JSON.parse(this.getItem('departments'));
|
||||||
|
}
|
||||||
|
|
||||||
storeRememberData({token, userId, expiration}) {
|
storeRememberData({token, userId, expiration}) {
|
||||||
this.setItem('rememberData-token', token);
|
this.setItem('rememberData-token', token);
|
||||||
this.setItem('rememberData-userId', userId);
|
this.setItem('rememberData-userId', userId);
|
||||||
@ -51,19 +55,17 @@ class SessionStore {
|
|||||||
storeConfigs(configs) {
|
storeConfigs(configs) {
|
||||||
this.setItem('language', configs.language);
|
this.setItem('language', configs.language);
|
||||||
this.setItem('reCaptchaKey', configs.reCaptchaKey);
|
this.setItem('reCaptchaKey', configs.reCaptchaKey);
|
||||||
|
this.setItem('departments', JSON.stringify(configs.departments));
|
||||||
}
|
}
|
||||||
|
|
||||||
getConfigs() {
|
getConfigs() {
|
||||||
return {
|
return {
|
||||||
language: this.getItem('language'),
|
language: this.getItem('language'),
|
||||||
reCaptchaKey: this.getItem('reCaptchaKey')
|
reCaptchaKey: this.getItem('reCaptchaKey'),
|
||||||
|
departments: this.getDepartments()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
areConfigsStored() {
|
|
||||||
return !!this.getItem('reCaptchaKey');
|
|
||||||
}
|
|
||||||
|
|
||||||
isRememberDataExpired() {
|
isRememberDataExpired() {
|
||||||
let rememberData = this.getRememberData();
|
let rememberData = this.getRememberData();
|
||||||
|
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
"slim/slim": "~2.0",
|
"slim/slim": "~2.0",
|
||||||
"gabordemooij/redbean": "~4.2",
|
"gabordemooij/redbean": "~4.2",
|
||||||
"respect/validation": "^1.1",
|
"respect/validation": "^1.1",
|
||||||
"phpmailer/phpmailer": "^5.2"
|
"phpmailer/phpmailer": "^5.2",
|
||||||
|
"google/recaptcha": "~1.1"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "5.0.*"
|
"phpunit/phpunit": "5.0.*"
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once 'system/init-settings.php';
|
require_once 'system/init-settings.php';
|
||||||
|
require_once 'system/get-settings.php';
|
||||||
|
|
||||||
$systemControllerGroup = new ControllerGroup();
|
$systemControllerGroup = new ControllerGroup();
|
||||||
$systemControllerGroup->setGroupPath('/system');
|
$systemControllerGroup->setGroupPath('/system');
|
||||||
|
|
||||||
$systemControllerGroup->addController(new InitSettingsController);
|
$systemControllerGroup->addController(new InitSettingsController);
|
||||||
|
$systemControllerGroup->addController(new GetSettingsController);
|
||||||
|
|
||||||
$systemControllerGroup->finalize();
|
$systemControllerGroup->finalize();
|
20
server/controllers/system/get-settings.php
Normal file
20
server/controllers/system/get-settings.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class GetSettingsController extends Controller {
|
||||||
|
const PATH = '/get-settings';
|
||||||
|
|
||||||
|
public function validations() {
|
||||||
|
return [
|
||||||
|
'permission' => 'any',
|
||||||
|
'requestData' => []
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handler() {
|
||||||
|
Response::respondSuccess([
|
||||||
|
'language' => Setting::getSetting('language')->getValue(),
|
||||||
|
'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(),
|
||||||
|
'departments' => Department::getDepartmentNames()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -25,6 +25,8 @@ class InitSettingsController extends Controller {
|
|||||||
private function storeGlobalSettings() {
|
private function storeGlobalSettings() {
|
||||||
$this->storeSettings([
|
$this->storeSettings([
|
||||||
'language' => 'en',
|
'language' => 'en',
|
||||||
|
'recaptcha-public' => '',
|
||||||
|
'recaptcha-private' => '',
|
||||||
'no-reply-email' => 'noreply@opensupports.com',
|
'no-reply-email' => 'noreply@opensupports.com',
|
||||||
'smtp-host' => 'localhost',
|
'smtp-host' => 'localhost',
|
||||||
'smtp-port' => 7070,
|
'smtp-port' => 7070,
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Respect\Validation\Validator as DataValidator;
|
use Respect\Validation\Validator as DataValidator;
|
||||||
|
DataValidator::with('CustomValidations', true);
|
||||||
|
|
||||||
class SignUpController extends Controller {
|
class SignUpController extends Controller {
|
||||||
const PATH = '/signup';
|
const PATH = '/signup';
|
||||||
@ -24,6 +25,10 @@ class SignUpController extends Controller {
|
|||||||
'password' => [
|
'password' => [
|
||||||
'validation' => DataValidator::length(5, 200),
|
'validation' => DataValidator::length(5, 200),
|
||||||
'error' => ERRORS::INVALID_PASSWORD
|
'error' => ERRORS::INVALID_PASSWORD
|
||||||
|
],
|
||||||
|
'captcha' => [
|
||||||
|
'validation' => DataValidator::captcha(),
|
||||||
|
'error' => ERRORS::INVALID_CAPTCHA
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
@ -13,4 +13,5 @@ class ERRORS {
|
|||||||
const INVALID_TICKET = 'Invalid ticket';
|
const INVALID_TICKET = 'Invalid ticket';
|
||||||
const INIT_SETTINGS_DONE = 'Settings already initialized';
|
const INIT_SETTINGS_DONE = 'Settings already initialized';
|
||||||
const INVALID_OLD_PASSWORD = 'Invalid old password';
|
const INVALID_OLD_PASSWORD = 'Invalid old password';
|
||||||
|
const INVALID_CAPTCHA = 'Invalid captcha';
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ spl_autoload_register(function ($class) {
|
|||||||
//Load custom validations
|
//Load custom validations
|
||||||
include_once 'libs/validations/dataStoreId.php';
|
include_once 'libs/validations/dataStoreId.php';
|
||||||
include_once 'libs/validations/userEmail.php';
|
include_once 'libs/validations/userEmail.php';
|
||||||
|
include_once 'libs/validations/captcha.php';
|
||||||
|
|
||||||
// LOAD CONTROLLERS
|
// LOAD CONTROLLERS
|
||||||
foreach (glob('controllers/*.php') as $controller) {
|
foreach (glob('controllers/*.php') as $controller) {
|
||||||
|
19
server/libs/validations/captcha.php
Normal file
19
server/libs/validations/captcha.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace CustomValidations;
|
||||||
|
|
||||||
|
use Respect\Validation\Rules\AbstractRule;
|
||||||
|
|
||||||
|
class Captcha extends AbstractRule {
|
||||||
|
|
||||||
|
public function validate($reCaptchaResponse) {
|
||||||
|
$reCaptchaPrivateKey = \Setting::getSetting('recaptcha-private')->getValue();
|
||||||
|
|
||||||
|
if (!$reCaptchaPrivateKey) return true;
|
||||||
|
|
||||||
|
$reCaptcha = new \ReCaptcha\ReCaptcha($reCaptchaPrivateKey);
|
||||||
|
$reCaptchaValidation = $reCaptcha->verify($reCaptchaResponse, $_SERVER['REMOTE_ADDR']);
|
||||||
|
|
||||||
|
return $reCaptchaValidation->isSuccess();
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
use RedBeanPHP\Facade as RedBean;
|
||||||
|
|
||||||
class Department extends DataStore {
|
class Department extends DataStore {
|
||||||
const TABLE = 'department';
|
const TABLE = 'department';
|
||||||
@ -9,4 +10,15 @@ class Department extends DataStore {
|
|||||||
'sharedTicketList'
|
'sharedTicketList'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getDepartmentNames() {
|
||||||
|
$departmentsQuantity = RedBean::count(Department::TABLE);
|
||||||
|
$departmentsNameList = [];
|
||||||
|
|
||||||
|
for ($departmentIndex = 1; $departmentIndex <= $departmentsQuantity; ++$departmentIndex) {
|
||||||
|
$departmentsNameList[] = Department::getDataStore($departmentIndex)->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $departmentsNameList;
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,2 +1,3 @@
|
|||||||
phpunit --colors tests/models
|
phpunit --colors tests/models
|
||||||
phpunit --colors tests/controllers
|
phpunit --colors tests/controllers
|
||||||
|
phpunit --colors tests/libs
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
include_once 'tests/__lib__/Mock.php';
|
||||||
|
|
||||||
class BeanMock implements ArrayAccess {
|
class BeanMock extends \Mock implements ArrayAccess {
|
||||||
private $properties;
|
private $properties;
|
||||||
|
|
||||||
public function __construct($array = []) {
|
public function __construct($array = []) {
|
||||||
|
24
server/tests/__mocks__/ReCaptchaMock.php
Normal file
24
server/tests/__mocks__/ReCaptchaMock.php
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace ReCaptcha {
|
||||||
|
include_once 'tests/__lib__/Mock.php';
|
||||||
|
|
||||||
|
class ReCaptcha extends \Mock {
|
||||||
|
public static $functionList = array();
|
||||||
|
public static $staticVerify;
|
||||||
|
public $verify;
|
||||||
|
|
||||||
|
public static function initVerify($value = true) {
|
||||||
|
self::$staticVerify = \Mock::stub()->returns(new \Mock([
|
||||||
|
'isSuccess' => \Mock::stub()->returns($value)
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __construct($privateKey) {
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->privateKey = $privateKey;
|
||||||
|
$this->verify = self::$staticVerify;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
server/tests/__mocks__/RespectMock.php
Normal file
5
server/tests/__mocks__/RespectMock.php
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Respect\Validation\Rules {
|
||||||
|
class AbstractRule {}
|
||||||
|
}
|
@ -20,6 +20,7 @@ class Setting extends \Mock {
|
|||||||
|
|
||||||
$mockUserInstance->name = 'MOCK_SETTING_NAME';
|
$mockUserInstance->name = 'MOCK_SETTING_NAME';
|
||||||
$mockUserInstance->value = 'MOCK_SETTING_VALUE';
|
$mockUserInstance->value = 'MOCK_SETTING_VALUE';
|
||||||
|
$mockUserInstance->getValue = \Mock::stub()->returns('MOCK_SETTING_VALUE');
|
||||||
|
|
||||||
return $mockUserInstance;
|
return $mockUserInstance;
|
||||||
}
|
}
|
||||||
|
35
server/tests/libs/validations/captchaTest.php
Normal file
35
server/tests/libs/validations/captchaTest.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
include_once 'tests/__lib__/Mock.php';
|
||||||
|
include_once 'tests/__mocks__/RespectMock.php';
|
||||||
|
include_once 'tests/__mocks__/SettingMock.php';
|
||||||
|
include_once 'tests/__mocks__/ReCaptchaMock.php';
|
||||||
|
|
||||||
|
include_once 'libs/validations/captcha.php';
|
||||||
|
|
||||||
|
class CaptchaValidationTest extends PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
|
protected function setUp() {
|
||||||
|
Setting::initStubs();
|
||||||
|
\ReCaptcha\ReCaptcha::initVerify();
|
||||||
|
|
||||||
|
$_SERVER['REMOTE_ADDR'] = 'MOCK_REMOTE';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testShouldReturnCorrectValue() {
|
||||||
|
$captchaValidation = new \CustomValidations\Captcha();
|
||||||
|
$response = $captchaValidation->validate('MOCK_RESPONSE');
|
||||||
|
$this->assertTrue($response);
|
||||||
|
|
||||||
|
\ReCaptcha\ReCaptcha::initVerify(false);
|
||||||
|
$response = $captchaValidation->validate('MOCK_RESPONSE');
|
||||||
|
$this->assertFalse($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testShouldPassCorrectValuesToCaptcha() {
|
||||||
|
$captchaValidation = new \CustomValidations\Captcha();
|
||||||
|
$captchaValidation->validate('MOCK_RESPONSE');
|
||||||
|
|
||||||
|
$this->assertTrue(Setting::get('getSetting')->hasBeenCalledWithArgs('recaptcha-private'));
|
||||||
|
$this->assertTrue(\ReCaptcha\ReCaptcha::$staticVerify->hasBeenCalledWithArgs('MOCK_RESPONSE', 'MOCK_REMOTE'));
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ require './scripts.rb'
|
|||||||
|
|
||||||
# TESTS
|
# TESTS
|
||||||
require './system/init-settings.rb'
|
require './system/init-settings.rb'
|
||||||
|
require './system/get-settings.rb'
|
||||||
require './user/signup.rb'
|
require './user/signup.rb'
|
||||||
require './user/login.rb'
|
require './user/login.rb'
|
||||||
require './user/send-recover-password.rb'
|
require './user/send-recover-password.rb'
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
./clean_db.sh
|
./clean_db.sh
|
||||||
|
./clean_db.sh
|
||||||
|
./clean_db.sh
|
||||||
bacon init.rb
|
bacon init.rb
|
11
tests/system/get-settings.rb
Normal file
11
tests/system/get-settings.rb
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
describe '/system/get-settings' do
|
||||||
|
it 'should return correct values' do
|
||||||
|
result = request('/system/get-settings')
|
||||||
|
|
||||||
|
(result['status']).should.equal('success')
|
||||||
|
(result['data']['language']).should.equal('en')
|
||||||
|
(result['data']['departments'][0]).should.equal('Tech Support')
|
||||||
|
(result['data']['departments'][1]).should.equal('Suggestions')
|
||||||
|
(result['data']['departments'][2]).should.equal('Sales and Subscriptions')
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user