Skip to content

Instantly share code, notes, and snippets.

@tillkruss
Last active April 6, 2020 18:34
Show Gist options
  • Save tillkruss/ddae5630a156156f22eb41cdbc8ab4bb to your computer and use it in GitHub Desktop.
Save tillkruss/ddae5630a156156f22eb41cdbc8ab4bb to your computer and use it in GitHub Desktop.
Junior developer code challenge for Mercatus

Mercatus code challenge

Hi there!

Please write thorough and human-readable tests for the WaitlistController.php.

  • You can use unit, feature and/or browser tests
  • Cover corner-cases / regressions
  • The tests don't actually need run

Please email your submission in form of a link to either a fork of this gist with your test files added, or alternatively a public git repository.

Estimated time: 1 hour
Deadline: 2019-09-12T09:00:00-07:00

@extends('layouts.plain')
@section('title', 'You’re subscribed')
@section('content')
<h1 class="text-3xl font-semibold leading-tight text-center mb-3">
Hooray! You’re on the waitlist.
</h1>
<p class="text-gray-600 text-center">
In the meantime, feel free to reach out to us anytime at:
<a href="mailto:{{ config('mail.from.address') }}">{{ config('mail.from.address') }}</a>
</p>
@endsection
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Subscriber extends Model
{
protected $fillable = [
'email',
];
}
<?php
namespace App\Mail;
use App\Models\Subscriber;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class SubscriberJoined extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public $subscriber;
public function __construct(Subscriber $subscriber)
{
$this->subscriber = $subscriber;
}
public function build()
{
return $this->markdown('emails.subscribers.joined-waitlist')
->subject('Someone joined the waitlist')
->replyTo($this->subscriber->email);
}
}
@extends('layouts.plain')
@section('title', 'The marketplace for verified buyers and sellers.')
@section('content')
<h1 class="text-3xl font-semibold leading-tight text-center mb-3">
The marketplace for <br class="hidden lg:inline">verified buyers and sellers.
</h1>
<p class="text-gray-600 text-center mb-10">
Licensed agricultural or extracted products.
</p>
<form class="max-w-sm xl:w-5/6 mx-auto" method="POST" action="{{ route('waitlist') }}">
@csrf
<div class="form-group">
<label class="form-label" for="email">{{ __('Email Address') }}</label>
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" autocomplete="email" required>
@error('email')
<div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror
</div>
<button type="submit" class="btn btn-block btn-primary mb-3">
{{ __('Request early access') }}
</button>
<div class="text-center">
<small class="text-gray-600">
Already have an account? <a class="text-primary" href="{{ route('login') }}">Log in</a>
or <a class="text-primary" href="{{ route('register') }}">redeem your code</a>.
</small>
</div>
</form>
@endsection
<?php
namespace App\Http\Controllers;
use App\Models\Subscriber;
use App\Mail\SubscriberJoined;
use App\Http\Requests\WaitlistRequest;
use Illuminate\Support\Facades\Mail;
class WaitlistController extends Controller
{
public function index()
{
return view('waitlist');
}
public function subscribe(WaitlistRequest $request)
{
$subscriber = Subscriber::create([
'email' => $request->email,
]);
Mail::to(config('mail.from.address'))->send(
new SubscriberJoined($subscriber)
);
return redirect()->route('subscribed');
}
public function subscribed()
{
return view('subscribed');
}
}
<?php
namespace App\Http\Requests;
class WaitlistRequest extends FormRequest
{
public function filters()
{
return [
'email' => 'mb_strtolower',
];
}
public function rules()
{
return [
'email' => [
'required',
'email:strict',
'unique:subscribers'
],
];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment